Author: sayer
Date: 2009-01-19 18:14:00 +0100 (Mon, 19 Jan 2009)
New Revision: 1226

Modified:
   trunk/core/AmSdp.cpp
   trunk/core/AmSdp.h
   trunk/core/AmUtils.cpp
Log:
fix: reject streams in SDP answer that we don't support/want
     reject streams offered with port 0 aswell


Modified: trunk/core/AmSdp.cpp
===================================================================
--- trunk/core/AmSdp.cpp        2009-01-19 17:11:43 UTC (rev 1225)
+++ trunk/core/AmSdp.cpp        2009-01-19 17:14:00 UTC (rev 1226)
@@ -103,7 +103,8 @@
 //
 AmSdp::AmSdp()
   : remote_active(false),
-    telephone_event_pt(NULL)
+    telephone_event_pt(NULL),
+    accepted_media(0)
 {
   l_origin.user = "sems";
   l_origin.sessId = get_random();
@@ -118,7 +119,8 @@
     conn(p_sdp_msg.conn),
     media(p_sdp_msg.media),
     telephone_event_pt(NULL),
-    remote_active(false)
+    remote_active(false),
+    accepted_media(0)
 {
   memcpy(r_buf,p_sdp_msg.r_buf,BUFFER_SIZE);
 }
@@ -212,6 +214,21 @@
  
  if(remote_active /* dir == SdpMedia::DirActive */)
    out_buf += "a=direction:passive\r\n";
+
+  // add rejected media line for all except the accepted one
+  for( vector<SdpMedia>::iterator m_it = media.begin(); m_it != media.end(); 
++m_it ){
+    if ((unsigned int)(m_it - media.begin())  != accepted_media) {
+      string rej_line = "m=" + media_t_2_str(m_it->type) + " 0 " +
+       transport_p_2_str(m_it->transport);
+      // add one bogus payload (required by sdp) - ignored (3264 s 6)
+      if (m_it->payloads.size()) {
+       rej_line += " "+int2str(m_it->payloads[0].payload_type)+"\n";
+      } else {
+       rej_line += " 0\n"; // violating 3264, but in this case the offer 
already did
+      }
+      out_buf += rej_line;
+    }
+  }
  
  return 0;
 }
@@ -285,7 +302,9 @@
     //  DBG("media clock rates: %d\n", m_it->payloads[i].clock_rate);
     //}
     //    DBG("type found: %d\n", m_it->payloads[0].t);
-    if( (media_type != m_it->type) )
+
+    // only accept our media type, and reject if port=0 (section 8.2)
+    if( (media_type != m_it->type) || (!m_it->port))
       continue;
 
     vector<SdpPayload>::iterator it = m_it->payloads.begin();
@@ -338,6 +357,9 @@
        remote_active = true;
       
       port = (int)m_it->port;
+
+      // save index of accepted media
+      accepted_media = m_it - media.begin();
     }
     break;
   }

Modified: trunk/core/AmSdp.h
===================================================================
--- trunk/core/AmSdp.h  2009-01-19 17:11:43 UTC (rev 1225)
+++ trunk/core/AmSdp.h  2009-01-19 17:14:00 UTC (rev 1226)
@@ -160,6 +160,8 @@
   // us to do passive RTP ?
   bool remote_active;
 
+  unsigned int accepted_media;   // index of the media which we accept (todo: 
multi stream)
+
   SdpOrigin        l_origin;      // local origin (o= )
     
   AmSdp();

Modified: trunk/core/AmUtils.cpp
===================================================================
--- trunk/core/AmUtils.cpp      2009-01-19 17:11:43 UTC (rev 1225)
+++ trunk/core/AmUtils.cpp      2009-01-19 17:14:00 UTC (rev 1226)
@@ -978,5 +978,10 @@
   }
 
   DBG("setting %s to: '%s'\n",name,var.c_str());
+#ifndef BSD_COMP
   setenv(name,var.c_str(),1);
+#else
+  string sol_putenv = name + "=" + var;
+  putenv(sol_putenv.c_str());
+#endif
 }

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

Reply via email to