📄 sdpbuild.cpp
字号:
#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 + -