Author: sayer
Date: 2009-12-05 01:47:36 +0100 (Sat, 05 Dec 2009)
New Revision: 1623

Modified:
   trunk/apps/dsm/DSMCall.cpp
   trunk/apps/dsm/DSMCall.h
   trunk/apps/dsm/DSMCoreModule.cpp
   trunk/apps/dsm/DSMCoreModule.h
   trunk/apps/dsm/DSMSession.h
   trunk/apps/dsm/doc/dsm_syntax.txt
Log:
allows setting headers on outgoing B2B- B leg.

 B2B.clearHeaders()
   clear the headers used for outgoing INVITE on B leg

 B2B.addHeader(string header)
  add a header for outgoing INVITE on B leg
 
 B2B.setHeaders(string headers [, replace_crlf=true|false])
  set headers for outgoing INVITE on B leg
  replace_crlf=true for replacing \r\n with CRLF
  e.g. 
  B2B.setHeaders("P-One: value\r\nP-Two: anothervalue", true)



Modified: trunk/apps/dsm/DSMCall.cpp
===================================================================
--- trunk/apps/dsm/DSMCall.cpp  2009-12-04 18:29:51 UTC (rev 1622)
+++ trunk/apps/dsm/DSMCall.cpp  2009-12-05 00:47:36 UTC (rev 1623)
@@ -440,3 +440,38 @@
       req.method.c_str(), req.cseq);
   recvd_req.insert(std::make_pair(req.cseq, req));
 }
+
+void DSMCall::B2BsetHeaders(const string& hdr, bool replaceCRLF) {
+  if (!replaceCRLF)  {
+    invite_req.hdrs = hdr;
+  } else {
+    string hdr_crlf = hdr;
+    DBG("hdr_crlf is '%s'\n", hdr_crlf.c_str());
+
+    while (true) {
+      size_t p = hdr_crlf.find("\\r\\n");
+      if (p==string::npos)
+       break;
+      hdr_crlf.replace(p, 4, "\r\n");
+    }
+    DBG("-> hdr_crlf is '%s'\n", hdr_crlf.c_str());
+    invite_req.hdrs += hdr_crlf;
+  }
+  // add \r\n if not in header
+  if (invite_req.hdrs.length()>2 && 
+      invite_req.hdrs.substr(invite_req.hdrs.length()-2) != "\r\n")
+    invite_req.hdrs+="\r\n";
+}
+
+void DSMCall::B2BaddHeader(const string& hdr) {
+  invite_req.hdrs +=hdr;
+  // add \r\n if not in header
+  if (invite_req.hdrs.length()>2 && 
+      invite_req.hdrs.substr(invite_req.hdrs.length()-2) != "\r\n")
+    invite_req.hdrs+="\r\n";
+}
+
+void DSMCall::B2BclearHeaders() {
+  invite_req.hdrs.clear();
+}
+

Modified: trunk/apps/dsm/DSMCall.h
===================================================================
--- trunk/apps/dsm/DSMCall.h    2009-12-04 18:29:51 UTC (rev 1622)
+++ trunk/apps/dsm/DSMCall.h    2009-12-05 00:47:36 UTC (rev 1623)
@@ -117,6 +117,9 @@
                        bool relayed_invite = false);
 
   void B2BaddReceivedRequest(const AmSipRequest& req);
+  void B2BsetHeaders(const string& hdr, bool replaceCRLF);
+  void B2BclearHeaders();
+  void B2BaddHeader(const string& hdr);
 };
 
 #endif

Modified: trunk/apps/dsm/DSMCoreModule.cpp
===================================================================
--- trunk/apps/dsm/DSMCoreModule.cpp    2009-12-04 18:29:51 UTC (rev 1622)
+++ trunk/apps/dsm/DSMCoreModule.cpp    2009-12-05 00:47:36 UTC (rev 1623)
@@ -99,6 +99,9 @@
   DEF_CMD("B2B.connectCallee", SCB2BConnectCalleeAction);
   DEF_CMD("B2B.terminateOtherLeg", SCB2BTerminateOtherLegAction);
   DEF_CMD("B2B.sendReinvite", SCB2BReinviteAction);
+  DEF_CMD("B2B.addHeader", SCB2BAddHeaderAction);
+  DEF_CMD("B2B.clearHeaders", SCB2BClearHeadersAction);
+  DEF_CMD("B2B.setHeaders", SCB2BSetHeadersAction);
 
   return NULL;
 }
@@ -828,3 +831,26 @@
   bool updateSDP = par1=="true";
   sess->sendReinvite(updateSDP, par2);
 } EXEC_ACTION_END;
+
+EXEC_ACTION_START(SCB2BAddHeaderAction) {
+  string val = resolveVars(arg, sess, sc_sess, event_params);
+  DBG("adding B2B header '%s'\n", val.c_str());
+  sc_sess->B2BaddHeader(val);
+} EXEC_ACTION_END;
+
+CONST_ACTION_2P(SCB2BSetHeadersAction,',', true);
+EXEC_ACTION_START(SCB2BSetHeadersAction) {
+  string val = resolveVars(par1, sess, sc_sess, event_params);
+  string repl = resolveVars(par2, sess, sc_sess, event_params);
+  bool replace_crlf = false;
+  if (repl == "true")
+    replace_crlf = true;
+  DBG("setting B2B headers to '%s' (%sreplacing CRLF)\n", 
+      val.c_str(), replace_crlf?"":"not ");
+  sc_sess->B2BsetHeaders(val, replace_crlf);
+} EXEC_ACTION_END;
+
+EXEC_ACTION_START(SCB2BClearHeadersAction) {
+  DBG("clearing B2B headers\n");
+  sc_sess->B2BclearHeaders();
+} EXEC_ACTION_END;

Modified: trunk/apps/dsm/DSMCoreModule.h
===================================================================
--- trunk/apps/dsm/DSMCoreModule.h      2009-12-04 18:29:51 UTC (rev 1622)
+++ trunk/apps/dsm/DSMCoreModule.h      2009-12-05 00:47:36 UTC (rev 1623)
@@ -93,6 +93,10 @@
 DEF_ACTION_1P(SCB2BTerminateOtherLegAction);
 DEF_ACTION_2P(SCB2BReinviteAction);
 
+DEF_ACTION_1P(SCB2BAddHeaderAction);
+DEF_ACTION_1P(SCB2BClearHeadersAction);
+DEF_ACTION_2P(SCB2BSetHeadersAction);
+
 class SCDIAction                                       
 : public DSMAction {
   vector<string> params;

Modified: trunk/apps/dsm/DSMSession.h
===================================================================
--- trunk/apps/dsm/DSMSession.h 2009-12-04 18:29:51 UTC (rev 1622)
+++ trunk/apps/dsm/DSMSession.h 2009-12-05 00:47:36 UTC (rev 1623)
@@ -98,9 +98,18 @@
                                bool relayed_invite = false) = 0;
   virtual void B2BterminateOtherLeg() = 0;
 
-  /** insert reqeust in list of received ones */
+  /** insert request in list of received ones */
   virtual void B2BaddReceivedRequest(const AmSipRequest& req) = 0;
 
+  /** set headers of outgoing INVITE */
+  virtual void B2BsetHeaders(const string& hdr, bool replaceCRLF) = 0;
+
+  /** set headers of outgoing INVITE */
+  virtual void B2BclearHeaders() = 0;
+
+  /** add a header to the headers of outgoing INVITE */
+  virtual void B2BaddHeader(const string& hdr) = 0;
+
   /** transfer ownership of object to this session instance */
   virtual void transferOwnership(DSMDisposable* d) = 0;
 

Modified: trunk/apps/dsm/doc/dsm_syntax.txt
===================================================================
--- trunk/apps/dsm/doc/dsm_syntax.txt   2009-12-04 18:29:51 UTC (rev 1622)
+++ trunk/apps/dsm/doc/dsm_syntax.txt   2009-12-05 00:47:36 UTC (rev 1623)
@@ -97,6 +97,18 @@
    generate_sdp can be 'true' or 'false'
    (B2B.sendReinvite(true) recommended)
 
+ B2B.clearHeaders()
+   clear the headers used for outgoing INVITE on B leg
+
+ B2B.addHeader(string header)
+  add a header for outgoing INVITE on B leg
+ 
+ B2B.setHeaders(string headers [, replace_crlf=true|false])
+  set headers for outgoing INVITE on B leg
+  replace_crlf=true for replacing \r\n with CRLF
+  e.g. 
+  B2B.setHeaders("P-One: value\r\nP-Two: anothervalue", true)
+
  setPrompts(name) 
    if more than one prompt sets are loaded
 

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to