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

Reply via email to