o onInvite event

o early dialogs



git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1127 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 18 years ago
parent 992593f278
commit dfbf9816c9

@ -56,6 +56,7 @@ DSMFactory* DSMFactory::instance()
string DSMFactory::InboundStartDiag;
string DSMFactory::OutboundStartDiag;
map<string, string> DSMFactory::config;
bool DSMFactory::RunInviteEvent;
DSMFactory::DSMFactory(const string& _app_name)
: AmSessionFactory(_app_name),
@ -185,6 +186,8 @@ int DSMFactory::onLoad()
cfg.begin(); it != cfg.end(); it++)
config[it->first] = it->second;
RunInviteEvent = cfg.getParameter("run_invite_event")=="yes";
return 0;
}

@ -67,6 +67,7 @@ public:
static DSMFactory* instance();
static map<string, string> config;
static bool RunInviteEvent;
int onLoad();
AmSession* onInvite(const AmSipRequest& req);

@ -80,7 +80,7 @@ DSMAction* DSMCoreModule::getAction(const string& from_str) {
DEF_CMD("stopRecord", SCStopRecordAction);
DEF_CMD("closePlaylist", SCClosePlaylistAction);
DEF_CMD("addSeparator", SCAddSeparatorAction);
DEF_CMD("connectMedia", SCConnectMediaAction);
DEF_CMD("set", SCSetAction);
DEF_CMD("append", SCAppendAction);
@ -142,6 +142,12 @@ DSMCondition* DSMCoreModule::getCondition(const string& from_str) {
if (cmd == "eventTest")
return new TestDSMCondition(params, DSMCondition::DSMEvent);
if (cmd == "invite")
return new TestDSMCondition(params, DSMCondition::Invite);
if (cmd == "sessionStart")
return new TestDSMCondition(params, DSMCondition::SessionStart);
ERROR("could not find condition for '%s'\n", cmd.c_str());
return NULL;
}
@ -288,6 +294,15 @@ bool SCClosePlaylistAction::execute(AmSession* sess,
return false;
}
bool SCConnectMediaAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {
GET_SCSESSION();
sc_sess->connectMedia();
return false;
}
bool SCStopAction::execute(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params) {

@ -55,6 +55,7 @@ DEF_SCStrArgAction(SCRecordFileAction);
DEF_SCStrArgAction(SCStopRecordAction);
DEF_SCStrArgAction(SCClosePlaylistAction);
DEF_SCStrArgAction(SCStopAction);
DEF_SCStrArgAction(SCConnectMediaAction);
DEF_SCStrArgAction(SCSetPromptsAction);
DEF_SCStrArgAction(SCAddSeparatorAction);

@ -27,6 +27,8 @@
#include "DSMDialog.h"
#include "AmUtils.h"
#include "AmMediaProcessor.h"
#include "DSM.h"
DSMDialog::DSMDialog(AmPromptCollection& prompts,
DSMStateDiagramCollection& diags,
@ -51,9 +53,28 @@ DSMDialog::~DSMDialog()
it->second->cleanup((long)this);
}
/** returns whether var exists && var==value*/
bool DSMDialog::checkVar(const string& var_name, const string& var_val) {
map<string, string>::iterator it = var.find(var_name);
if ((it != var.end()) && (it->second == var_val))
return false;
return true;
}
void DSMDialog::onInvite(const AmSipRequest& req) {
engine.onInvite(req, this);
AmSession::onInvite(req);
bool run_session_invite = engine.onInvite(req, this);
if (DSMFactory::RunInviteEvent) {
if (!engine.init(this, startDiagName, DSMCondition::Invite))
run_session_invite =false;
run_session_invite &=
!checkVar(DSM_CONNECT_SESSION, DSM_CONNECT_SESSION_FALSE);
}
if (run_session_invite)
AmSession::onInvite(req);
}
void DSMDialog::onSessionStart(const AmSipRequest& req)
@ -69,16 +90,27 @@ void DSMDialog::onSessionStart(const AmSipReply& rep)
}
void DSMDialog::startSession(){
engine.init(this, startDiagName);
engine.init(this, startDiagName, DSMCondition::SessionStart);
setReceiving(true);
if (checkVar(DSM_CONNECT_SESSION, DSM_CONNECT_SESSION_FALSE)) {
if (!getInput())
setInput(&playlist);
setOutput(&playlist);
}
}
void DSMDialog::connectMedia() {
if (!getInput())
setInput(&playlist);
setOutput(&playlist);
AmMediaProcessor::instance()->addSession(this, callgroup);
}
void DSMDialog::onDtmf(int event, int duration_msec) {
DBG("* Got DTMF key %d duration %d\n",
event, duration_msec);

@ -51,6 +51,7 @@ class DSMDialog : public AmSession,
AmAudioFile* rec_file;
map<string, AmPromptCollection*> prompt_sets;
bool checkVar(const string& var_name, const string& var_val);
public:
DSMDialog(AmPromptCollection& prompts,
DSMStateDiagramCollection& diags,
@ -81,6 +82,7 @@ public:
void setPromptSet(const string& name);
void addSeparator(const string& name);
void connectMedia();
};
#endif

@ -46,7 +46,7 @@ class DSMModule {
virtual DSMCondition* getCondition(const string& from_str) = 0;
virtual int preload() { return 0; }
virtual void onInvite(const AmSipRequest& req, DSMSession* sess) { }
virtual bool onInvite(const AmSipRequest& req, DSMSession* sess) { return true; }
};
typedef void* (*SCFactoryCreate)();

@ -27,7 +27,8 @@
#include "DSMSession.h"
DSMSession::DSMSession() {
DSMSession::DSMSession()
: last_req(0) {
}
DSMSession::~DSMSession() {

@ -29,6 +29,7 @@
#include "AmArg.h"
#include "AmEvent.h"
#include "AmSipMsg.h"
#include <string>
using std::string;
@ -36,12 +37,19 @@ using std::string;
using std::vector;
#include <map>
using std::map;
#include <memory>
#define DSM_ERRNO_FILE "1"
#define DSM_ERRNO_UNKNOWN_ARG "2"
#define DSM_ERRNO_GENERAL "99"
#define DSM_ERRNO_OK ""
#define DSM_REPLY_REQUEST "reply_request" // todo: rethink these names
#define DSM_REPLY_REQUEST_FALSE "0"
#define DSM_CONNECT_SESSION "connect_session" // todo: rethink these names
#define DSM_CONNECT_SESSION_FALSE "0"
#define SET_ERRNO(new_errno) \
var["errno"] = new_errno
@ -58,12 +66,15 @@ class DSMSession {
virtual void closePlaylist(bool notify) = 0;
virtual void setPromptSet(const string& name) = 0;
virtual void addSeparator(const string& name) = 0;
virtual void connectMedia() = 0;
/* holds variables which are accessed by $varname */
map<string, string> var;
/* result of the last DI call */
AmArg di_res;
/* last received request */
std::auto_ptr<AmSipRequest> last_req;
};

@ -111,13 +111,15 @@ DSMStateEngine::DSMStateEngine()
}
DSMStateEngine::~DSMStateEngine() {
}
void DSMStateEngine::onInvite(const AmSipRequest& req, DSMSession* sess) {
bool DSMStateEngine::onInvite(const AmSipRequest& req, DSMSession* sess) {
bool res = true;
for (vector<DSMModule*>::iterator it =
mods.begin(); it != mods.end(); it++)
(*it)->onInvite(req, sess);
res &= (*it)->onInvite(req, sess);
return res;
}
bool DSMStateEngine::runactions(vector<DSMAction*>::iterator from,
@ -167,16 +169,17 @@ void DSMStateEngine::addModules(vector<DSMModule*> modules) {
mods.push_back(*it);
}
bool DSMStateEngine::init(AmSession* sess, const string& startDiagram) {
bool DSMStateEngine::init(AmSession* sess, const string& startDiagram,
DSMCondition::EventType init_event) {
if (!jumpDiag(startDiagram, sess, DSMCondition::Any, NULL)) {
if (!jumpDiag(startDiagram, sess, init_event, NULL)) {
ERROR("initializing with start diag '%s'\n",
startDiagram.c_str());
return false;
}
DBG("run null event...\n");
runEvent(sess, DSMCondition::Any, NULL);
DBG("run init event...\n");
runEvent(sess, init_event, NULL);
return true;
}

@ -57,6 +57,8 @@ class DSMCondition
public:
enum EventType {
Any,
Invite,
SessionStart,
Key,
Timer,
@ -174,13 +176,15 @@ class DSMStateEngine {
void addDiagram(DSMStateDiagram* diag);
void addModules(vector<DSMModule*> modules);
bool init(AmSession* sess, const string& startDiagram);
bool init(AmSession* sess, const string& startDiagram,
DSMCondition::EventType init_event);
void runEvent(AmSession* sess,
DSMCondition::EventType event,
map<string,string>* event_params);
void onInvite(const AmSipRequest& req, DSMSession* sess);
/** @return whether call should be accepted */
bool onInvite(const AmSipRequest& req, DSMSession* sess);
};

@ -61,6 +61,7 @@ actions:
stop(<send bye>)
e.g. stop(false), stop(true)
=============================
conditions:
@ -102,4 +103,16 @@ imports:
module load path. modules provide conditions and actions.
modules' actions/conditions-factory is checked first
(modules can override core conditions/actions)
=============================
special variables:
reply_request "0" ->do not reply to the request as standard behaviour
connect_session "0" ->do not connect session to media processor on start
=============================
errors:
actions set $errno
#define DSM_ERRNO_OK ""
#define DSM_ERRNO_FILE "1"
#define DSM_ERRNO_UNKNOWN_ARG "2"
#define DSM_ERRNO_GENERAL "99"
...

@ -23,3 +23,8 @@ load_prompts=/usr/local/etc/sems/etc/dsm_in_prompts.conf,/usr/local/etc/sems/etc
# load files with this name (+.conf), e.g. mydomain.conf
#load_prompts_sets=mydomain
# if run_invite_event is set to "yes", an "invite" event is run
# before the session is started. can be used e.g. for early media
# of delaying final reply
#
#run_invite_event=yes

@ -111,8 +111,9 @@ bool URIParseAction::execute(AmSession* sess,
return false;
}
void URIModule::onInvite(const AmSipRequest& req, DSMSession* sess) {
bool URIModule::onInvite(const AmSipRequest& req, DSMSession* sess) {
sess->var["hdrs"] = req.hdrs;
return true;
}
CONST_TwoParAction(URIGetHeaderAction, ",", false);

@ -38,7 +38,7 @@ class URIModule
DSMAction* getAction(const string& from_str);
DSMCondition* getCondition(const string& from_str);
void onInvite(const AmSipRequest& req, DSMSession* sess);
bool onInvite(const AmSipRequest& req, DSMSession* sess);
};
DEF_TwoParAction(URIParseAction);

Loading…
Cancel
Save