⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdpbuild.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "sdpbuild.h"#include "../kphone/sessioncontrol.h"#include "../kphone/kstatics.h"SdpBuild::SdpBuild ( SessionControl *sco, SipCall *scall){//	printf(":::::: SdpBuild start\n");	tempresponsepay=160;	msg="=";	call=scall;	sessionC=sco;	testPort = "0";	testHomePort = "0";	audioPort = "0";	audioHomePort = "0";	responsePay = 160;	videoPrefCodec = " ";	prefCodec = " ";	vecID = " ";	cntParam = 0;	remoteStart = false;	if (sessionC) {		if (sessionC->getSrtpMode() >0) {			trsp   = " RTP/SAVP ";		} else {		trsp   = " RTP/AVP ";			}	}	auEnd  = "8000\r\n";	viEnd  = "90000\r\n";	end    = "\r\n";	telend = "101\r\n";	mIs    = "m=application";	mAudio = "m=audio ";	mVideo = "m=video ";	aRMap  = "a=rtpmap:";	tEvent = "101 telephone-event";	ReInvite = false;	testHost = "0.0.0.0";	if(sessionC) {		responsePay = sessionC->getPayload();	}}SdpBuild::~SdpBuild(void){//	printf(":::::: SdpBuild stop\n");}QString SdpBuild::prepInviteString(int load,QString audioport,QString port) {// Evaluate the media type for the SDP-description        msg = "v=0\r\n"; // Version        msg += "o=username 0 0 IN ";	msg +="IP4 " + Sip::getLocalAddress() +end; // Session Id        msg += "s=The Funky Flow\r\n"; // Session Name        msg += "c=IN ";	msg +="IP4 " + Sip::getLocalAddress() +end; // Connection Info        msg += "t=0 0\r\n"; // Time active// prepare the Media information    if (load == (int)SipCall::StandardCall) { 	msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(0) + sessionC->getNZPrefCodecNum(1)+	+ sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend; 	if(sessionC->getPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getPrefCodecNum(0) + " " + sessionC->getPrefCodec(0) + "/" + auEnd;	if(sessionC->getPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getPrefCodecNum(1) + " " + sessionC->getPrefCodec(1) + "/" + auEnd;	if(sessionC->getPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getPrefCodecNum(2) + " " + sessionC->getPrefCodec(2) + "/" + auEnd;	if(sessionC->getPrefCodecNum(3) != "-1") msg += aRMap + sessionC->getPrefCodecNum(3) + " " + sessionC->getPrefCodec(3) + "/" + auEnd;	if(sessionC->getPrefCodecNum(4) != "-1") msg += aRMap + sessionC->getPrefCodecNum(4) + " " + sessionC->getPrefCodec(4) + "/" + auEnd;			msg += aRMap + tEvent + "/" + auEnd;		if(sessionC->getILBC()) {		if(getResponsePay() == 240) {			msg += "a=fmtp:97 mode=30\r\n";		} else {			msg += "a=fmtp:97 mode=20\r\n";		}	}    } else if( load == (int)SipCall::videoCall) {     	msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (0)+ " " + sessionC->getNZVidPrefCodecNum (1)+		" " + sessionC->getNZVidPrefCodecNum (2)+end;				if(sessionC->getVidPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(0) + " " + sessionC->getVidPrefCodec(0) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(1) + " " + sessionC->getVidPrefCodec(1) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(2) + " " + sessionC->getVidPrefCodec(2) + "/" + viEnd;	    } else if( load == (int)SipCall::auviCall) {   		msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(0) + sessionC->getNZPrefCodecNum(1)+	+ sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend; 	if(sessionC->getPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getPrefCodecNum(0) + " " + sessionC->getPrefCodec(0) + "/" + auEnd;	if(sessionC->getPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getPrefCodecNum(1) + " " + sessionC->getPrefCodec(1) + "/" + auEnd;	if(sessionC->getPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getPrefCodecNum(2) + " " + sessionC->getPrefCodec(2) + "/" + auEnd;	if(sessionC->getPrefCodecNum(3) != "-1") msg += aRMap + sessionC->getPrefCodecNum(3) + " " + sessionC->getPrefCodec(3) + "/" + auEnd;	if(sessionC->getPrefCodecNum(4) != "-1") msg += aRMap + sessionC->getPrefCodecNum(4) + " " + sessionC->getPrefCodec(4) + "/" + auEnd;			msg += aRMap + tEvent + "/" + auEnd;		if(sessionC->getILBC()) {		if(getResponsePay() == 240) {			msg += "a=fmtp:97 mode=30\r\n";		} else {			msg += "a=fmtp:97 mode=20\r\n";		}	}	msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (0)+ " " + sessionC->getNZVidPrefCodecNum (1)+		" " + sessionC->getNZVidPrefCodecNum (2)+end;		if(sessionC->getVidPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(0) + " " + sessionC->getVidPrefCodec(0) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(1) + " " + sessionC->getVidPrefCodec(1) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(2) + " " + sessionC->getVidPrefCodec(2) + "/" + viEnd;	    } else {		int posN=sessionC->theVectorId(load).find( '\n' ) + 1;        vecID = sessionC->theVectorId(load);	vecID = vecID.remove( 0, posN );	int trans=sessionC->useL4(load);	if(trans==useudpL4){			transp=" udp ";	} else {			transp=" RTP/AVP ";	}	msg += mIs +  " " +  port  + transp + vecID + end;	if(call->isRemoteStart()) {	            msg += "a=fmtp:" + vecID + " rstart" + end;        }}return msg;}QString SdpBuild::prepAcceptString(int load,QString audioport,QString port, bool isHold) {// Evaluate the media type for the SDP-description	msg = "v=0\r\n"; // Version        msg += "o=username 0 0 IN ";	msg+="IP4 ";	// Connection Info	msg += Sip::getLocalAddress() +end;// Session Id        	if(isHold) {        	msg += "s=Put me on Hold\r\n";  // Session Name		msg += "c=IN IP4 0.0.0.0\r\n";	// Connection Info	} else {		msg += "s=The Funky Flow\r\n"; // Session Name		msg += "c=IN IP4 " + Sip::getLocalAddress() +end; // Connection Info	}        msg += "t=0 0\r\n"; // Time active// prepare the Media informationif (load == SipCall::StandardCall) {			if(getPrefCodecNum() == sessionC->getPrefCodecNum(0) ) {           msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(0) + sessionC->getNZPrefCodecNum(1)+	+ sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend;    	} else if(getPrefCodecNum() == sessionC->getPrefCodecNum(1) ) {           msg += mAudio + audioport + trsp + sessionC->getNZPrefCodecNum(1)+ sessionC->getNZPrefCodecNum(0)+	+ sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend;	} else if(getPrefCodecNum() == sessionC->getPrefCodecNum(2) ){           msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(2)+ sessionC->getNZPrefCodecNum(0) +	+ sessionC->getNZPrefCodecNum(1)+ sessionC->getNZPrefCodecNum(3)+ sessionC->getNZPrefCodecNum(4) + telend;	} else if(getPrefCodecNum() == sessionC->getPrefCodecNum(3) ){           msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(3)+ sessionC->getNZPrefCodecNum(0) +	sessionC->getNZPrefCodecNum(1)+ sessionC->getNZPrefCodecNum(2)+ sessionC->getNZPrefCodecNum(4) + telend;	} else if(getPrefCodecNum() == sessionC->getPrefCodecNum(4) )        {          msg += mAudio + audioport  +trsp+ sessionC-> getNZPrefCodecNum(4)+ " " + sessionC->getNZPrefCodecNum(0) +	" " + sessionC->getNZPrefCodecNum(1)+ + sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + telend;        } else {	   msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(0) + sessionC->getNZPrefCodecNum(1)+	+ sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend;	}	if(sessionC->getPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getPrefCodecNum(0) + " " + sessionC->getPrefCodec(0) + "/" + auEnd;	if(sessionC->getPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getPrefCodecNum(1) + " " + sessionC->getPrefCodec(1) + "/" + auEnd;	if(sessionC->getPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getPrefCodecNum(2) + " " + sessionC->getPrefCodec(2) + "/" + auEnd;	if(sessionC->getPrefCodecNum(3) != "-1") msg += aRMap + sessionC->getPrefCodecNum(3) + " " + sessionC->getPrefCodec(3) + "/" + auEnd;	if(sessionC->getPrefCodecNum(4) != "-1") msg += aRMap + sessionC->getPrefCodecNum(4) + " " + sessionC->getPrefCodec(4) + "/" + auEnd;	msg += aRMap + tEvent + "/" + auEnd;		if(sessionC->getILBC()) {		if(getResponsePay() == 240) {			msg += "a=fmtp:97 mode=30\r\n";		} else {			msg += "a=fmtp:97 mode=20\r\n";		}	}} else if( load == SipCall::videoCall) {      	if (sessionC->getVidPrefCodec(0) == getVidPrefCodec()) {        	msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (0)+ " " + sessionC->getNZVidPrefCodecNum (1)+		" " + sessionC->getVidPrefCodecNum (2)+end;        } else if (sessionC->getVidPrefCodec(1)== getVidPrefCodec() ) {		msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (1)+ " " + sessionC->getNZVidPrefCodecNum (0)+		" " + sessionC->getVidPrefCodecNum (2)+end;	} else         {        	msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (2)+ " " + sessionC->getNZVidPrefCodecNum (0)+		" " + sessionC->getNZVidPrefCodecNum (1)+end;        }	if(sessionC->getVidPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(0) + " " + sessionC->getVidPrefCodec(0) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(1) + " " + sessionC->getVidPrefCodec(1) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(2) + " " + sessionC->getVidPrefCodec(2) + "/" + viEnd;} else if( load == SipCall::auviCall) { 	if(getPrefCodec().contains(sessionC->getPrefCodec(0))){           msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(0) + sessionC->getNZPrefCodecNum(1)+	" " + sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend;	} else if(getPrefCodec().contains(sessionC->getPrefCodec(1))){           msg += mAudio + audioport + trsp + sessionC->getNZPrefCodecNum(1)+ sessionC->getNZPrefCodecNum(0)+	" " + sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + sessionC->getNZPrefCodecNum(4) + telend;	} else if(getPrefCodec().contains(sessionC->getPrefCodec(2))){           msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(2)+ sessionC->getNZPrefCodecNum(0) +	+ sessionC->getNZPrefCodecNum(1)+ sessionC->getNZPrefCodecNum(3)+ sessionC->getNZPrefCodecNum(4) + telend;	} else if(getPrefCodec().contains(sessionC->getPrefCodec(3))){           msg += mAudio + audioport  + trsp + sessionC->getNZPrefCodecNum(3)+ sessionC->getNZPrefCodecNum(0) +	sessionC->getNZPrefCodecNum(1)+ sessionC->getNZPrefCodecNum(2)+ sessionC->getNZPrefCodecNum(4) + telend;	} else         {          msg += mAudio + audioport  +trsp+ sessionC-> getNZPrefCodecNum(4)+ " " + sessionC->getNZPrefCodecNum(0) +	" " + sessionC->getNZPrefCodecNum(1)+ + sessionC->getNZPrefCodecNum(2) + sessionC->getNZPrefCodecNum(3) + telend;        }	if(sessionC->getPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getPrefCodecNum(0) + " " + sessionC->getPrefCodec(0) + "/" + auEnd;	if(sessionC->getPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getPrefCodecNum(1) + " " + sessionC->getPrefCodec(1) + "/" + auEnd;	if(sessionC->getPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getPrefCodecNum(2) + " " + sessionC->getPrefCodec(2) + "/" + auEnd;	if(sessionC->getPrefCodecNum(3) != "-1") msg += aRMap + sessionC->getPrefCodecNum(3) + " " + sessionC->getPrefCodec(3) + "/" + auEnd;	if(sessionC->getPrefCodecNum(4) != "-1") msg += aRMap + sessionC->getPrefCodecNum(4) + " " + sessionC->getPrefCodec(4) + "/" + auEnd;	msg += aRMap + tEvent + "/" + auEnd;        if (sessionC->getVidPrefCodec(0) == getVidPrefCodec()) {        	msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (0)+ " " + sessionC->getNZVidPrefCodecNum (1)+		" " + sessionC->getVidPrefCodecNum (2) + end;        } else if (sessionC->getVidPrefCodec(1)== getVidPrefCodec() ) {		msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (1)+ " " + sessionC->getNZVidPrefCodecNum (0)+		" " + sessionC->getVidPrefCodecNum (2)+ "/" + end;	} else         {        	msg += mVideo+port+trsp+ sessionC-> getNZVidPrefCodecNum (2)+ " " + sessionC->getNZVidPrefCodecNum (0)+		" " + sessionC->getNZVidPrefCodecNum (1) + end;        }		if(sessionC->getILBC()) {		if(getResponsePay() == 240) {			msg += "a=fmtp:97 mode=30\r\n";		} else {			msg += "a=fmtp:97 mode=20\r\n";		}	}		if(sessionC->getVidPrefCodecNum(0) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(0) + " " + sessionC->getVidPrefCodec(0) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(1) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(1) + " " + sessionC->getVidPrefCodec(1) + "/" + viEnd;	if(sessionC->getVidPrefCodecNum(2) != "-1") msg += aRMap + sessionC->getVidPrefCodecNum(2) + " " + sessionC->getVidPrefCodec(2) + "/" + viEnd;} else {	int posN=sessionC->theVectorId(load).find( '\n' ) + 1;        vecID = sessionC->theVectorId(load);	vecID = vecID.remove( 0, posN );	int trans=sessionC->useL4(load);	if(trans==useudpL4){			transp=" udp ";	} else {			transp=" RTP/AVP ";	}	msg += mIs + " " +  port  + transp + vecID + end;	if(call->isRemoteStart()) {            msg += "a=fmtp:" + vecID + " rstart" + end;        } }return msg;}int SdpBuild::checkVectorId(int stat, QString incomingId) {	int b = SipCall::extCall1-1;	int i = 1;	for(i = 1 ; i < 5; i++){		    if(incomingId == sessionC->theVectorId(b+i)) return b+i;	}	return 0;}	int SdpBuild::checkCodec( bool testReInvite, SipCallMember *member, bool forceHold , bool *srtpErr){	cntParam=0;	ReInvite=testReInvite;        int status = (int)SipCall::GarKeinCall;	int isRtpMap=0;	int i=0, j=0;	QString transT;        bool evaluateV=false, evaluateA=false, evaluateAV=false;        QString mstr = member->getSessionDescription();        QString ipaddress;        QString curline;        QString portstr;        QString codecstr;        QString codecstr1;        QString codecstr2;        int receivedAudioMediaNumber = 0, receivedVideoMediaNumber = 0;        QString dp=":";	QString sec;        mstr += '\n';                        // Guarentee termination        if( mstr.left( mstr.find( '\n' ) ) != "v=0" ) {	return doReturn (status);        }        mstr.remove( 0, mstr.find( '\n' ) + 1 );        while( mstr.length() > 2 ) {                curline = mstr.left( mstr.find( '\n' ) );                mstr.remove( 0, mstr.find( '\n' ) + 1 );	        if( curline.left( curline.find( '=' ) ) == "c" ) {            		if( curline.contains("IP4") ) {		    	    ipaddress = curline.mid( curline.find( "IP4" ) + 4 ).stripWhiteSpace();			}		}                		if( curline.contains("m=audio")) {			//printf("SdpBuild::checkCodec %s\n",curline.latin1());			if(ipaddress.contains("0.0.0.0") || ipaddress.contains("::0") || forceHold){                        status = (int) SipCall::putMeOnHold;			setExtHost(ipaddress);			return  doReturn (status);			} else {				if(evaluateV==true) {					evaluateAV=true;					status = (int)SipCall::auviCall;				} else {					status = (int)SipCall::StandardCall;					evaluateA=true;				}				if ( ( curline.contains("RTP/SAVP") && (sessionC->getSrtpMode() != 1) )|| ( curline.contains("RTP/AVP") && (sessionC->getSrtpMode() != 0) ) ) {				    printf (" SdpBuild::checkCodec srtp error\n");				    *srtpErr = true;				}				setAudioPort(curline.section(' ',1,1));				setExtHost(ipaddress);				int i = (-1);				do {					i++;					acc[i] = curline.section(' ', i+3, i+3);									} while (acc[i].length() != 0);				receivedAudioMediaNumber = i;								}                }                if( curline.contains("m=video")) {			if(ipaddress.contains("0.0.0.0") || forceHold){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -