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