r2743 - in trunk/libminisip: include/libminisip/sdp source/mediahandler source/sdp

mikma at minisip.org mikma at minisip.org
Fri Sep 1 21:52:37 CEST 2006


Author: mikma
Date: 2006-09-01 21:52:36 +0200 (Fri, 01 Sep 2006)
New Revision: 2743

Modified:
   trunk/libminisip/include/libminisip/sdp/SdpHeader.h
   trunk/libminisip/include/libminisip/sdp/SdpHeaderC.h
   trunk/libminisip/include/libminisip/sdp/SdpHeaderM.h
   trunk/libminisip/include/libminisip/sdp/SdpPacket.h
   trunk/libminisip/source/mediahandler/Session.cxx
   trunk/libminisip/source/sdp/SdpHeaderC.cxx
   trunk/libminisip/source/sdp/SdpHeaderM.cxx
   trunk/libminisip/source/sdp/SdpPacket.cxx
Log:
In preparation for SDP ANAT support.
Add SdpHeaderM copy constructor and assignment operator.
Save connection (C) header in the corresponding media header,
and at the session level.


Modified: trunk/libminisip/include/libminisip/sdp/SdpHeader.h
===================================================================
--- trunk/libminisip/include/libminisip/sdp/SdpHeader.h	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/include/libminisip/sdp/SdpHeader.h	2006-09-01 19:52:36 UTC (rev 2743)
@@ -72,7 +72,7 @@
 		 * @return An integer that determines where in the
 		 *         list of headers this header will be in the
 		 *         SDP message. 		 */
-		int32_t getPriority(){return priority;};
+		int32_t getPriority() const {return priority;};
 
 		/**
 		 * All headers have a type identifier (integer) that is 

Modified: trunk/libminisip/include/libminisip/sdp/SdpHeaderC.h
===================================================================
--- trunk/libminisip/include/libminisip/sdp/SdpHeaderC.h	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/include/libminisip/sdp/SdpHeaderC.h	2006-09-01 19:52:36 UTC (rev 2743)
@@ -39,6 +39,8 @@
 
 #include<string>
 
+class IPAddress;
+
 class LIBMINISIP_API SdpHeaderC : public SdpHeader{
 	public:
 		SdpHeaderC(std::string buildFrom);
@@ -47,21 +49,25 @@
 		
 		virtual std::string getMemObjectType(){return "SdpHeaderC";}
 
-		std::string getNetType();
+		const std::string &getNetType() const;
 		void setNetType(std::string netType);
 
-		std::string getAddrType();
+		const std::string &getAddrType() const;
 		void setAddrType(std::string addrType);
 
-		std::string getAddr();
+		const std::string &getAddr() const;
 		void setAddr(std::string addr);
 
 		virtual std::string getString();
 
+		MRef<IPAddress*> getIPAdress();
+
 	private:
 		std::string netType;
 		std::string addrType;
 		std::string addr;
+
+		MRef<IPAddress*> ipAddr;
 };
 
 #endif

Modified: trunk/libminisip/include/libminisip/sdp/SdpHeaderM.h
===================================================================
--- trunk/libminisip/include/libminisip/sdp/SdpHeaderM.h	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/include/libminisip/sdp/SdpHeaderM.h	2006-09-01 19:52:36 UTC (rev 2743)
@@ -37,6 +37,7 @@
 #include<libminisip/libminisip_config.h>
 
 #include<libminisip/sdp/SdpHeader.h>
+#include<libminisip/sdp/SdpHeaderC.h>
 #include<vector>
 
 class SdpHeaderA;
@@ -45,8 +46,11 @@
 	public:
 		SdpHeaderM(std::string buildFrom);
 		SdpHeaderM(std::string media, int32_t port, int32_t n_ports, std::string transport);
+		SdpHeaderM(const SdpHeaderM &src);
 		virtual ~SdpHeaderM();
 		
+		SdpHeaderM &operator=(const SdpHeaderM &src);
+
 		virtual std::string getMemObjectType(){return "SdpHeaderM";}
 
 		void addFormat(int32_t format);
@@ -74,6 +78,9 @@
 		std::string getRtpMap(uint32_t format);
 		
 		std::string getFmtpParam(uint32_t format);
+
+		void setConnection( MRef<SdpHeaderC*> c );
+		MRef<SdpHeaderC*> getConnection();
 		
 	private:
 		std::string media;
@@ -82,6 +89,7 @@
 		std::string transport;
 		std::vector<int32_t> formats;
 		std::list<MRef<SdpHeaderA*> >attributes;
+		MRef<SdpHeaderC*> connection;
 };
 
 #endif

Modified: trunk/libminisip/include/libminisip/sdp/SdpPacket.h
===================================================================
--- trunk/libminisip/include/libminisip/sdp/SdpPacket.h	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/include/libminisip/sdp/SdpPacket.h	2006-09-01 19:52:36 UTC (rev 2743)
@@ -46,6 +46,7 @@
 
 #include<libminisip/sdp/SdpPacket.h>
 #include<libminisip/sdp/SdpHeader.h>
+#include<libminisip/sdp/SdpHeaderC.h>
 
 MRef<SipMessageContent*> sdpSipMessageContentFactory(const std::string & buf, const std::string & ContentType);
 
@@ -58,7 +59,7 @@
 	
 		virtual std::string getMemObjectType(){return "SdpPacket";}
 		
-		MRef<IPAddress *>getRemoteAddr(int &ret_port);
+		MRef<SdpHeaderC*> getSessionLevelConnection();
 		std::string getKeyMgmt();
 		void addHeader(MRef<SdpHeader*> h);
 		virtual std::string getString();

Modified: trunk/libminisip/source/mediahandler/Session.cxx
===================================================================
--- trunk/libminisip/source/mediahandler/Session.cxx	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/source/mediahandler/Session.cxx	2006-09-01 19:52:36 UTC (rev 2743)
@@ -203,9 +203,6 @@
 	unsigned int i;
 	int j;
 	MRef<MediaStreamReceiver *> receiver;
-	MRef<IPAddress *> remoteAddress;
-	// Not used
-	int port;
 	bool found = false;
 
 	this->peerUri = peerUri;
@@ -238,7 +235,7 @@
 		}
 		*/
 	}
-	remoteAddress = answer->getRemoteAddr( port );
+	MRef<SdpHeaderC*> sessionConn = answer->getSessionLevelConnection();
 
 	for( i = 0; i < answer->getHeaders().size(); i++ ){
 		if( answer->getHeaders()[i]->getType() == SDP_HEADER_TYPE_M ){
@@ -247,6 +244,18 @@
 			cerr << "Session::setSdpAnswer - trying media line " << m->getString() << endl;
 #endif
 			
+			MRef<IPAddress *> remoteAddress;
+			MRef<SdpHeaderC *> c = m->getConnection();
+			if( !c )
+				c = sessionConn;
+
+			if( !c ){
+				cerr << "Session::setSdpAnswer - skip missing connection" << endl;
+				continue;
+			}
+
+			remoteAddress = c->getIPAdress();
+
 			for( j = 0; j < m->getNrFormats(); j++ ){
 				receiver = matchFormat( m, j, remoteAddress );
 
@@ -325,9 +334,6 @@
 	int j;
 	MRef<MediaStreamReceiver *> receiver;
 	MRef<SdpPacket *> packet;
-	MRef<IPAddress *> remoteAddress;
-	// Not used
-	int port;
 	string keyMgmtMessage;
 	std::list<std::string>::iterator iAttribute;
 	std::list<std::string> attributes;
@@ -359,10 +365,10 @@
 	}
 		
 
-	remoteAddress = offer->getRemoteAddr( port );
-
 	sdpAnswer = emptySdp();
 
+	MRef<SdpHeaderC*> sessionConn = offer->getSessionLevelConnection();
+
 	for( i = 0; i < offer->getHeaders().size(); i++ ){
 
 		if( offer->getHeaders()[i]->getType() == SDP_HEADER_TYPE_M ){
@@ -384,6 +390,31 @@
 
 			sdpAnswer->addHeader( *answerM );
 
+			MRef<SdpHeaderC *> c = offerM->getConnection();
+			MRef<IPAddress *> remoteAddress;
+			string addrString;
+
+			if( !c )
+				c = sessionConn;
+
+			if( !c )
+				continue;
+
+			if ( c->getNetType() != "IN" )
+				continue;
+
+			if( c->getAddrType() == "IP4" ){
+				if( localIpString.empty() )
+					continue;
+				addrString = localIpString;
+			}
+			else{
+				continue;
+			}
+
+			remoteAddress = c->getIPAdress();
+			answerM->setConnection( new SdpHeaderC("IN", c->getAddrType(), addrString ));
+
 			for( j = 0; j < offerM->getNrFormats(); j++ ){
 				receiver = matchFormat( offerM, j, remoteAddress );
 

Modified: trunk/libminisip/source/sdp/SdpHeaderC.cxx
===================================================================
--- trunk/libminisip/source/sdp/SdpHeaderC.cxx	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/source/sdp/SdpHeaderC.cxx	2006-09-01 19:52:36 UTC (rev 2743)
@@ -34,6 +34,7 @@
 
 #include<libminisip/sdp/SdpHeaderC.h>
 #include<libmutil/itoa.h>
+#include<libmnetutil/IPAddress.h>
 #include<iostream>
 
 using namespace std;
@@ -76,7 +77,7 @@
 
 }
 
-string SdpHeaderC::getNetType(){
+const string &SdpHeaderC::getNetType()const{
 	return netType;
 }
 
@@ -84,14 +85,14 @@
 	this->netType=net_type;
 }
 
-string SdpHeaderC::getAddrType(){
+const string &SdpHeaderC::getAddrType()const{
 	return addrType;
 }
 void SdpHeaderC::setAddrType(string addr_type){
 	this->addrType=addr_type;
 }
 
-string SdpHeaderC::getAddr(){
+const string &SdpHeaderC::getAddr()const{
 //	cerr << "Returning addr: "<< addr << endl;
 	return addr;
 }
@@ -119,4 +120,16 @@
 	return ret;
 }
 
+MRef<IPAddress*> SdpHeaderC::getIPAdress(){
+	if( !ipAddr ){
+		if( netType != "IN" )
+			return NULL;
 
+		if( addrType != "IP4" && addrType != "IP6" )
+			return NULL;
+
+		ipAddr = IPAddress::create( addr, addrType == "IP6" );
+	}
+
+	return ipAddr;
+}

Modified: trunk/libminisip/source/sdp/SdpHeaderM.cxx
===================================================================
--- trunk/libminisip/source/sdp/SdpHeaderM.cxx	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/source/sdp/SdpHeaderM.cxx	2006-09-01 19:52:36 UTC (rev 2743)
@@ -114,6 +114,28 @@
 	this->transport=transport;
 }
 
+SdpHeaderM::SdpHeaderM(const SdpHeaderM &src): SdpHeader( SDP_HEADER_TYPE_M, 8 ){
+	*this = src;
+}
+
+SdpHeaderM &SdpHeaderM::operator=(const SdpHeaderM &src){
+	set_priority( src.getPriority() );
+	media = src.media;
+	port = src.port;
+	nPorts = src.nPorts;
+	transport = src.transport;
+	formats = src.formats;
+	attributes.clear();
+
+	list<MRef<SdpHeaderA *> >::const_iterator i;
+
+	for(i=src.attributes.begin(); i!=src.attributes.end(); i++){
+		addAttribute( new SdpHeaderA( ***i ) );
+	}
+
+	return *this;
+}
+
 SdpHeaderM::~SdpHeaderM(){
 
 }
@@ -176,6 +198,9 @@
 	for (unsigned i=0; i< formats.size(); i++)
 		ret+=" "+itoa(formats[i]);
 
+	if( connection )
+		ret += "\r\n" + connection->getString();
+
 	return ret;
 }
 
@@ -233,3 +258,12 @@
 list<MRef<SdpHeaderA *> > SdpHeaderM::getAttributes(){
 	return attributes;
 }
+
+
+void SdpHeaderM::setConnection( MRef<SdpHeaderC*> c ){
+	connection = c;
+}
+
+MRef<SdpHeaderC*> SdpHeaderM::getConnection(){
+	return connection;
+}

Modified: trunk/libminisip/source/sdp/SdpPacket.cxx
===================================================================
--- trunk/libminisip/source/sdp/SdpPacket.cxx	2006-08-31 15:24:20 UTC (rev 2742)
+++ trunk/libminisip/source/sdp/SdpPacket.cxx	2006-09-01 19:52:36 UTC (rev 2743)
@@ -34,6 +34,7 @@
 
 #include<libminisip/sdp/SdpPacket.h>
 #include<libmnetutil/IP4Address.h>
+#include<libmnetutil/NetworkException.h>
 
 #include<libmutil/trim.h>
 #include<libmutil/itoa.h>
@@ -78,9 +79,14 @@
 			case 's':
 				addHeader(MRef<SdpHeader*>(new SdpHeaderS(lines[i])));
 				break;
-			case 'c':
-				addHeader(MRef<SdpHeader*>(new SdpHeaderC(lines[i])));
+			case 'c':{
+				MRef<SdpHeaderC*> c = new SdpHeaderC(lines[i]);
+				if( lastM )
+					lastM->setConnection(c);
+				else
+					addHeader(*c);
 				break;
+				}
 			case 't':
 				addHeader(MRef<SdpHeader*>(new SdpHeaderT(lines[i])));
 				break;
@@ -210,35 +216,20 @@
 
 
 
-MRef<IPAddress *> SdpPacket::getRemoteAddr(int &ret_port){
-	string addr="";
-	int32_t port=-1;
-	MRef<SdpHeaderC*> cptr;
-	MRef<SdpHeaderM*> mptr;
+MRef<SdpHeaderC*> SdpPacket::getSessionLevelConnection(){
 //	cerr << "starting parse of remote addr in SDP packet"<< endl;
 	for (unsigned i=0; i<headers.size(); i++){
 		if ( headers[i].isNull() )
 			cerr <<"WARNING: sdp header is null"<< endl;
 //		cerr << "testing header with prio "<< headers[i]->get_priority()<< endl;
 		if ((headers[i])->getType() == SDP_HEADER_TYPE_C){
+			MRef<SdpHeaderC*> cptr;
 			cptr = MRef<SdpHeaderC*>((SdpHeaderC *)*(headers[i]));
-			addr=cptr->getAddr();
+			return cptr;
 		}
-		if ((headers[i])->getType() == SDP_HEADER_TYPE_M){
-			mptr = MRef<SdpHeaderM*>((SdpHeaderM *)*(headers[i]));
-			port=mptr->getPort();
-		}
 	}
-//	cerr << "in SDP packet: Remote addr is "<<addr << ":" << port << endl;
-	MRef<IPAddress *> a(new IP4Address(addr));
-        //a->set_port(port);
-#ifdef DEBUG_OUTPUT
-	if (port==-1){
-		merr << "WARNING: Did not find remote port (in SdpPacket::getRemoteAddr)"<< end;
-	}
-#endif
-        ret_port = port;
-	return a;
+
+	return NULL;
 }
 
 string SdpPacket::getKeyMgmt(){



More information about the Minisip-devel mailing list