Author: sayer
Date: 2008-11-11 15:57:39 +0100 (Tue, 11 Nov 2008)
New Revision: 1128
Added:
trunk/apps/dsm/mods/mod_dlg/
trunk/apps/dsm/mods/mod_dlg/Makefile
trunk/apps/dsm/mods/mod_dlg/ModDlg.cpp
trunk/apps/dsm/mods/mod_dlg/ModDlg.h
trunk/apps/dsm/mods/mod_dlg/Readme.mod_uri.txt
Log:
mod_dlg for early media, late reply, delayed 200, processing before replying
etc.
Added: trunk/apps/dsm/mods/mod_dlg/Makefile
===================================================================
--- trunk/apps/dsm/mods/mod_dlg/Makefile 2008-11-11 14:43:52 UTC (rev
1127)
+++ trunk/apps/dsm/mods/mod_dlg/Makefile 2008-11-11 14:57:39 UTC (rev
1128)
@@ -0,0 +1,18 @@
+plug_in_name = mod_dlg
+
+DSMPATH ?= ../..
+
+module_ldflags =
+module_cflags = -DMOD_NAME=\"$(plug_in_name)\" -I$(DSMPATH)
+
+COREPATH ?=$(DSMPATH)/../../core
+lib_full_name = $(DSMPATH)/mods/lib/$(lib_name)
+include $(COREPATH)/plug-in/Makefile.app_module
+
+.PHONY: install
+install: all $(extra_install)
+ mkdir -p $(lib-prefix)/$(lib-dir)/dsm
+ if [ -f "$(lib_name)" ]; then \
+ $(INSTALL-TOUCH) $(lib-prefix)/$(lib-dir)/dsm/; \
+ $(INSTALL-MODULES) $(lib_name) $(lib-prefix)/$(lib-dir)/dsm/; \
+ fi
Property changes on: trunk/apps/dsm/mods/mod_dlg/Makefile
___________________________________________________________________
Name: svn:eol-style
+ native
Added: trunk/apps/dsm/mods/mod_dlg/ModDlg.cpp
===================================================================
--- trunk/apps/dsm/mods/mod_dlg/ModDlg.cpp 2008-11-11 14:43:52 UTC (rev
1127)
+++ trunk/apps/dsm/mods/mod_dlg/ModDlg.cpp 2008-11-11 14:57:39 UTC (rev
1128)
@@ -0,0 +1,166 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2008 iptego GmbH
+ *
+ * This file is part of SEMS, a free SIP media server.
+ *
+ * sems is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * For a license to use the SEMS software under conditions
+ * other than those described here, or to purchase support for this
+ * software, please contact iptel.org by e-mail at the following addresses:
+ * [EMAIL PROTECTED]
+ *
+ * SEMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include "ModDlg.h"
+#include "log.h"
+#include "AmUtils.h"
+
+#include "DSMSession.h"
+#include "AmSession.h"
+#include <string.h>
+
+#include "DSMCoreModule.h"
+
+SC_EXPORT(DLGModule);
+
+DLGModule::DLGModule() {
+}
+
+DLGModule::~DLGModule() {
+}
+
+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;
+}
+
+DSMAction* DLGModule::getAction(const string& from_str) {
+ string cmd;
+ 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("dlg.reply", DLGReplyAction);
+ DEF_CMD("dlg.acceptInvite", DLGAcceptInviteAction);
+
+ return NULL;
+}
+
+DSMCondition* DLGModule::getCondition(const string& from_str) {
+ return NULL;
+}
+
+bool DLGModule::onInvite(const AmSipRequest& req, DSMSession* sess) {
+ // save inivital invite to last_req
+ sess->last_req.reset(new AmSipRequest(req));
+ return true;
+}
+
+#define GET_SCSESSION() \
+ DSMSession* sc_sess = dynamic_cast<DSMSession*>(sess); \
+ if (!sc_sess) { \
+ ERROR("wrong session type\n"); \
+ return false; \
+ }
+
+CONST_TwoParAction(DLGReplyAction, ",", true);
+
+bool DLGReplyAction::execute(AmSession* sess,
+ DSMCondition::EventType event,
+ map<string,string>* event_params) {
+ GET_SCSESSION();
+
+ string code = resolveVars(par1, sess, sc_sess, event_params);
+ string reason = resolveVars(par2, sess, sc_sess, event_params);
+ unsigned int code_i;
+ if (str2i(code, code_i)) {
+ ERROR("decoding reply code '%s'\n", code.c_str());
+ sc_sess->SET_ERRNO(DSM_ERRNO_UNKNOWN_ARG);
+ return false;
+ }
+
+ if (!sc_sess->last_req.get()) {
+ ERROR("no last request to reply\n");
+ sc_sess->SET_ERRNO(DSM_ERRNO_GENERAL);
+ return false;
+ }
+
+ if (sess->dlg.reply(*sc_sess->last_req.get(), code_i, reason))
+ sc_sess->SET_ERRNO(DSM_ERRNO_GENERAL);
+ else
+ sc_sess->SET_ERRNO(DSM_ERRNO_OK);
+
+ return false;
+}
+
+CONST_TwoParAction(DLGAcceptInviteAction, ",", true);
+
+bool DLGAcceptInviteAction::execute(AmSession* sess,
+ DSMCondition::EventType event,
+ map<string,string>* event_params) {
+ GET_SCSESSION();
+
+ // defaults to 200 OK
+ unsigned int code_i=200;
+ string reason = "OK";
+ string code = resolveVars(par1, sess, sc_sess, event_params);
+ DBG("GOT CODE %s\n", code.c_str());
+ if (code.length()) {
+ reason = resolveVars(par2, sess, sc_sess, event_params);
+ if (str2i(code, code_i)) {
+ ERROR("decoding reply code '%s'\n", code.c_str());
+ sc_sess->SET_ERRNO(DSM_ERRNO_UNKNOWN_ARG);
+ return false;
+ }
+ }
+
+ if (!sc_sess->last_req.get()) {
+ ERROR("no last request to reply\n");
+ sc_sess->SET_ERRNO(DSM_ERRNO_GENERAL);
+ return false;
+ }
+
+ try {
+ string sdp_reply;
+
+ sess->acceptAudio(sc_sess->last_req.get()->body,
+ sc_sess->last_req.get()->hdrs,&sdp_reply);
+ if(sess->dlg.reply(*sc_sess->last_req.get(),code_i, reason,
+ "application/sdp",sdp_reply) != 0)
+ throw AmSession::Exception(500,"could not send response");
+
+ }catch(const AmSession::Exception& e){
+
+ ERROR("%i %s\n",e.code,e.reason.c_str());
+ sess->setStopped();
+ AmSipDialog::reply_error(*sc_sess->last_req.get(),e.code,e.reason);
+ }
+
+ return false;
+}
Property changes on: trunk/apps/dsm/mods/mod_dlg/ModDlg.cpp
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: trunk/apps/dsm/mods/mod_dlg/ModDlg.h
===================================================================
--- trunk/apps/dsm/mods/mod_dlg/ModDlg.h 2008-11-11 14:43:52 UTC (rev
1127)
+++ trunk/apps/dsm/mods/mod_dlg/ModDlg.h 2008-11-11 14:57:39 UTC (rev
1128)
@@ -0,0 +1,46 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2008 iptego GmbH
+ *
+ * This file is part of SEMS, a free SIP media server.
+ *
+ * sems is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * For a license to use the SEMS software under conditions
+ * other than those described here, or to purchase support for this
+ * software, please contact iptel.org by e-mail at the following addresses:
+ * [EMAIL PROTECTED]
+ *
+ * SEMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _MOD_DLG_H
+#define _MOD_DLG_H
+#include "DSMModule.h"
+
+class DLGModule
+: public DSMModule {
+
+ public:
+ DLGModule();
+ ~DLGModule();
+
+ DSMAction* getAction(const string& from_str);
+ DSMCondition* getCondition(const string& from_str);
+
+ bool onInvite(const AmSipRequest& req, DSMSession* sess);
+};
+
+DEF_TwoParAction(DLGReplyAction);
+DEF_TwoParAction(DLGAcceptInviteAction);
+#endif
Property changes on: trunk/apps/dsm/mods/mod_dlg/ModDlg.h
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: trunk/apps/dsm/mods/mod_dlg/Readme.mod_uri.txt
===================================================================
--- trunk/apps/dsm/mods/mod_dlg/Readme.mod_uri.txt 2008-11-11 14:43:52 UTC
(rev 1127)
+++ trunk/apps/dsm/mods/mod_dlg/Readme.mod_uri.txt 2008-11-11 14:57:39 UTC
(rev 1128)
@@ -0,0 +1,13 @@
+* mod_dlg saves the initial INVITE to DSMSession::last_req
+
+
+dlg.reply(code,reason);
+ reply to the request in DSMSession::last_req
+ (usually INVITE, if not yet replied) with code and reason
+
+dlg.acceptInvite([code, reason]);
+ e.g. dlg.acceptInvite(183, progress);
+
+ accept audio stream from last_req (INVITE), and reply with 200 OK (default)
+ or code, reason
+
Property changes on: trunk/apps/dsm/mods/mod_dlg/Readme.mod_uri.txt
___________________________________________________________________
Name: svn:eol-style
+ native
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev