Author: sayer
Date: 2008-11-11 15:43:52 +0100 (Tue, 11 Nov 2008)
New Revision: 1127
Modified:
trunk/apps/dsm/DSM.cpp
trunk/apps/dsm/DSM.h
trunk/apps/dsm/DSMCoreModule.cpp
trunk/apps/dsm/DSMCoreModule.h
trunk/apps/dsm/DSMDialog.cpp
trunk/apps/dsm/DSMDialog.h
trunk/apps/dsm/DSMModule.h
trunk/apps/dsm/DSMSession.cpp
trunk/apps/dsm/DSMSession.h
trunk/apps/dsm/DSMStateEngine.cpp
trunk/apps/dsm/DSMStateEngine.h
trunk/apps/dsm/doc/dsm_syntax.txt
trunk/apps/dsm/etc/dsm.conf
trunk/apps/dsm/mods/mod_uri/ModUri.cpp
trunk/apps/dsm/mods/mod_uri/ModUri.h
Log:
o onInvite event
o early dialogs
Modified: trunk/apps/dsm/DSM.cpp
===================================================================
--- trunk/apps/dsm/DSM.cpp 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSM.cpp 2008-11-11 14:43:52 UTC (rev 1127)
@@ -56,6 +56,7 @@
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 @@
cfg.begin(); it != cfg.end(); it++)
config[it->first] = it->second;
+ RunInviteEvent = cfg.getParameter("run_invite_event")=="yes";
+
return 0;
}
Modified: trunk/apps/dsm/DSM.h
===================================================================
--- trunk/apps/dsm/DSM.h 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSM.h 2008-11-11 14:43:52 UTC (rev 1127)
@@ -67,6 +67,7 @@
static DSMFactory* instance();
static map<string, string> config;
+ static bool RunInviteEvent;
int onLoad();
AmSession* onInvite(const AmSipRequest& req);
Modified: trunk/apps/dsm/DSMCoreModule.cpp
===================================================================
--- trunk/apps/dsm/DSMCoreModule.cpp 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMCoreModule.cpp 2008-11-11 14:43:52 UTC (rev 1127)
@@ -80,8 +80,8 @@
DEF_CMD("stopRecord", SCStopRecordAction);
DEF_CMD("closePlaylist", SCClosePlaylistAction);
DEF_CMD("addSeparator", SCAddSeparatorAction);
+ DEF_CMD("connectMedia", SCConnectMediaAction);
-
DEF_CMD("set", SCSetAction);
DEF_CMD("append", SCAppendAction);
DEF_CMD("log", SCLogAction);
@@ -142,6 +142,12 @@
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 @@
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) {
Modified: trunk/apps/dsm/DSMCoreModule.h
===================================================================
--- trunk/apps/dsm/DSMCoreModule.h 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMCoreModule.h 2008-11-11 14:43:52 UTC (rev 1127)
@@ -55,6 +55,7 @@
DEF_SCStrArgAction(SCStopRecordAction);
DEF_SCStrArgAction(SCClosePlaylistAction);
DEF_SCStrArgAction(SCStopAction);
+DEF_SCStrArgAction(SCConnectMediaAction);
DEF_SCStrArgAction(SCSetPromptsAction);
DEF_SCStrArgAction(SCAddSeparatorAction);
Modified: trunk/apps/dsm/DSMDialog.cpp
===================================================================
--- trunk/apps/dsm/DSMDialog.cpp 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMDialog.cpp 2008-11-11 14:43:52 UTC (rev 1127)
@@ -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 @@
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::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);
Modified: trunk/apps/dsm/DSMDialog.h
===================================================================
--- trunk/apps/dsm/DSMDialog.h 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMDialog.h 2008-11-11 14:43:52 UTC (rev 1127)
@@ -51,6 +51,7 @@
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 @@
void setPromptSet(const string& name);
void addSeparator(const string& name);
+ void connectMedia();
};
#endif
Modified: trunk/apps/dsm/DSMModule.h
===================================================================
--- trunk/apps/dsm/DSMModule.h 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMModule.h 2008-11-11 14:43:52 UTC (rev 1127)
@@ -46,7 +46,7 @@
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)();
Modified: trunk/apps/dsm/DSMSession.cpp
===================================================================
--- trunk/apps/dsm/DSMSession.cpp 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMSession.cpp 2008-11-11 14:43:52 UTC (rev 1127)
@@ -27,7 +27,8 @@
#include "DSMSession.h"
-DSMSession::DSMSession() {
+DSMSession::DSMSession()
+ : last_req(0) {
}
DSMSession::~DSMSession() {
Modified: trunk/apps/dsm/DSMSession.h
===================================================================
--- trunk/apps/dsm/DSMSession.h 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMSession.h 2008-11-11 14:43:52 UTC (rev 1127)
@@ -29,6 +29,7 @@
#include "AmArg.h"
#include "AmEvent.h"
+#include "AmSipMsg.h"
#include <string>
using std::string;
@@ -36,12 +37,19 @@
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 @@
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;
};
Modified: trunk/apps/dsm/DSMStateEngine.cpp
===================================================================
--- trunk/apps/dsm/DSMStateEngine.cpp 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMStateEngine.cpp 2008-11-11 14:43:52 UTC (rev 1127)
@@ -111,13 +111,15 @@
}
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 @@
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;
}
Modified: trunk/apps/dsm/DSMStateEngine.h
===================================================================
--- trunk/apps/dsm/DSMStateEngine.h 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/DSMStateEngine.h 2008-11-11 14:43:52 UTC (rev 1127)
@@ -57,6 +57,8 @@
public:
enum EventType {
Any,
+ Invite,
+ SessionStart,
Key,
Timer,
@@ -174,13 +176,15 @@
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);
};
Modified: trunk/apps/dsm/doc/dsm_syntax.txt
===================================================================
--- trunk/apps/dsm/doc/dsm_syntax.txt 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/doc/dsm_syntax.txt 2008-11-11 14:43:52 UTC (rev 1127)
@@ -61,6 +61,7 @@
stop(<send bye>)
e.g. stop(false), stop(true)
+
=============================
conditions:
@@ -102,4 +103,16 @@
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"
+ ...
Modified: trunk/apps/dsm/etc/dsm.conf
===================================================================
--- trunk/apps/dsm/etc/dsm.conf 2008-11-11 09:29:34 UTC (rev 1126)
+++ trunk/apps/dsm/etc/dsm.conf 2008-11-11 14:43:52 UTC (rev 1127)
@@ -23,3 +23,8 @@
# 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
Modified: trunk/apps/dsm/mods/mod_uri/ModUri.cpp
===================================================================
--- trunk/apps/dsm/mods/mod_uri/ModUri.cpp 2008-11-11 09:29:34 UTC (rev
1126)
+++ trunk/apps/dsm/mods/mod_uri/ModUri.cpp 2008-11-11 14:43:52 UTC (rev
1127)
@@ -111,8 +111,9 @@
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);
Modified: trunk/apps/dsm/mods/mod_uri/ModUri.h
===================================================================
--- trunk/apps/dsm/mods/mod_uri/ModUri.h 2008-11-11 09:29:34 UTC (rev
1126)
+++ trunk/apps/dsm/mods/mod_uri/ModUri.h 2008-11-11 14:43:52 UTC (rev
1127)
@@ -38,7 +38,7 @@
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);
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev