From 43539c50c52ded6af7fa44f3cf188ac30f3878be Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Tue, 2 Dec 2008 22:39:38 +0000 Subject: [PATCH] optionally relay headers from first INVITE into callee leg git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1156 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- apps/examples/b2b_connect/b2b_connect.cpp | 69 ++++++++----------- apps/examples/b2b_connect/b2b_connect.h | 13 ++-- .../examples/b2b_connect/etc/b2b_connect.conf | 7 ++ 3 files changed, 38 insertions(+), 51 deletions(-) create mode 100644 apps/examples/b2b_connect/etc/b2b_connect.conf diff --git a/apps/examples/b2b_connect/b2b_connect.cpp b/apps/examples/b2b_connect/b2b_connect.cpp index f17289cb..72004a99 100644 --- a/apps/examples/b2b_connect/b2b_connect.cpp +++ b/apps/examples/b2b_connect/b2b_connect.cpp @@ -30,9 +30,11 @@ #include "AmAudio.h" #include "AmPlugIn.h" #include "AmMediaProcessor.h" -//#include "AmConfigReader.h" +#include "AmConfigReader.h" #include "AmSessionContainer.h" +bool b2b_connectFactory::TransparentHeaders = true; // default + EXPORT_SESSION_FACTORY(b2b_connectFactory,MOD_NAME); b2b_connectFactory::b2b_connectFactory(const string& _app_name) @@ -44,10 +46,16 @@ b2b_connectFactory::b2b_connectFactory(const string& _app_name) int b2b_connectFactory::onLoad() { -// AmConfigReader cfg; -// if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) -// return -1; + AmConfigReader cfg; + if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) { + INFO("configuration file '%s' not found. using defaults.\n", + (AmConfig::ModConfigPath + string(MOD_NAME ".conf")).c_str()); + return 0; + } + if (cfg.getParameter("transparent_headers")=="false") + TransparentHeaders = false; + // user_timer_fact = AmPlugIn::instance()->getFactory4Di("user_timer"); // if(!user_timer_fact) { // ERROR("could not load user_timer from session_timer plug-in\n"); @@ -66,13 +74,18 @@ AmSession* b2b_connectFactory::onInvite(const AmSipRequest& req) // throw AmSession::Exception(500,"could not get a user timer reference"); // } + string app_param = getHeader(req.hdrs, PARAM_HDR); + + if (!app_param.length()) { + throw AmSession::Exception(500, "b2b_connect: parameters not found"); + } + return new b2b_connectDialog(); //user_timer); } b2b_connectDialog::b2b_connectDialog() // AmDynInvoke* user_timer) -: m_state(BB_Init), - //m_user_timer(user_timer), +: //m_user_timer(user_timer), AmB2ABCallerSession() { @@ -88,17 +101,11 @@ void b2b_connectDialog::onInvite(const AmSipRequest& req) // TODO: do reinvites get here? if so, don't set a timer then // -> yes, they do. - // TODO: errors thrown as exception don't seem to trigger a reply? - // -> only in SessionFactory::onInvite they do. todo: move the logic to - // session factory - - //setReceiving(false); - //AmMediaProcessor::instance()->removeSession(this); string app_param = getHeader(req.hdrs, PARAM_HDR); if (!app_param.length()) { - AmSession::Exception(500, "b2b_connect: parameters not found"); + throw AmSession::Exception(500, "b2b_connect: parameters not found"); } domain = get_header_keyvalue(app_param,"d"); @@ -108,41 +115,23 @@ void b2b_connectDialog::onInvite(const AmSipRequest& req) from = "sip:"+user+"@"+domain; to = "sip:"+req.user+"@"+domain; -// DBG("-----------------------------------------------------------------\n"); -// DBG("domain = %s, user = %s, pwd = %s, from = %s, to = %s;", -// domain.c_str(), user.c_str(), password.c_str(), from.c_str(), to.c_str()); -// DBG("-----------------------------------------------------------------\n"); - - m_state = BB_Dialing; - if(dlg.reply(req, 100, "Connecting") != 0) { throw AmSession::Exception(500,"Failed to reply 100"); } invite_req = req; - size_t pos1, pos2, hdr_start; - - if (findHeader(invite_req.hdrs,PARAM_HDR, pos1, pos2, - hdr_start)) { - while (invite_req.hdrs[pos2]=='\r' ||invite_req.hdrs[pos2]=='\n') - pos2++; - - hdr_start -= 11; //"P-App-Param" - invite_req.hdrs.erase(hdr_start, pos2-hdr_start); - } - - if (findHeader(invite_req.hdrs,"P-App-Name", pos1, pos2, - hdr_start)) { - while (invite_req.hdrs[pos2]=='\r' ||invite_req.hdrs[pos2]=='\n') - pos2++; - hdr_start -= 10; //"P-App-Name" - invite_req.hdrs.erase(hdr_start, pos2-hdr_start); + if (b2b_connectFactory::TransparentHeaders) { + removeHeader(invite_req.hdrs, PARAM_HDR); + removeHeader(invite_req.hdrs, "P-App-Name"); + removeHeader(invite_req.hdrs, "User-Agent"); + removeHeader(invite_req.hdrs, "Max-Forwards"); } dlg.updateStatus(req); recvd_req.insert(std::make_pair(req.cseq,req)); - connectCallee("<" + to + ">", to, from, from); + connectCallee("<" + to + ">", to, from, from, + b2b_connectFactory::TransparentHeaders ? invite_req.hdrs : ""); } void b2b_connectDialog::onSessionStart(const AmSipRequest& req) @@ -217,12 +206,8 @@ void b2b_connectDialog::onDtmf(int event, int duration) } - void b2b_connectDialog::onBye(const AmSipRequest& req) { - if (m_state == BB_Connected) { -// stopAccounting(); - } terminateOtherLeg(); setStopped(); } diff --git a/apps/examples/b2b_connect/b2b_connect.h b/apps/examples/b2b_connect/b2b_connect.h index 98275887..88a17faf 100644 --- a/apps/examples/b2b_connect/b2b_connect.h +++ b/apps/examples/b2b_connect/b2b_connect.h @@ -44,24 +44,19 @@ class b2b_connectFactory: public AmSessionFactory int onLoad(); AmSession* onInvite(const AmSipRequest& req); + + static bool TransparentHeaders; // default + }; class b2b_connectDialog : public AmB2ABCallerSession { - enum { - BB_Init = 0, - BB_Dialing, - BB_Connected, - BB_Teardown - } CallerState; - - int m_state; - string domain; string user; string password; string from; string to; + AmSipRequest invite_req; /* AmDynInvoke* m_user_timer; */ diff --git a/apps/examples/b2b_connect/etc/b2b_connect.conf b/apps/examples/b2b_connect/etc/b2b_connect.conf new file mode 100644 index 00000000..a8a6082b --- /dev/null +++ b/apps/examples/b2b_connect/etc/b2b_connect.conf @@ -0,0 +1,7 @@ +# +# transparent_headers = [true|false] +# +# relay headers from initial INVITE into callee leg? +# +# default: +# transparent_headers = true