session.cxx
来自「MiniSip Client with DomainKeys Authentic」· CXX 代码 · 共 635 行 · 第 1/2 页
CXX
635 行
MRef<MediaStreamReceiver *> receiver; MRef<SdpPacket *> packet; IPAddress * remoteAddress; // Not used int port; string keyMgmtMessage; std::list<std::string>::iterator iAttribute; std::list<std::string> attributes; std::list<MRef<Codec *> > codecs; std::list<MRef<Codec *> >::iterator iC;// uint8_t payloadType; string rtpmap; this->peerUri = peerUri;// cerr << "Session::setSdpOffer" << endl; keyMgmtMessage = offer->getSessionLevelAttribute( "key-mgmt" ); if( keyMgmtMessage != "" ){ if( !responderAuthenticate( keyMgmtMessage ) ){ errorString = "Incoming key management message could not be authenticated"; if( ka ){ errorString += ": " + ka->authError(); } return false; } else //Here we set the offer in ka setMikeyOffer(); } else{ securityConfig.secured = false; securityConfig.ka_type = KEY_MGMT_METHOD_NULL; } remoteAddress = offer->getRemoteAddr( port ); sdpAnswer = emptySdp(); for( i = 0; i < offer->getHeaders().size(); i++ ){ if( offer->getHeaders()[i]->getType() == SDP_HEADER_TYPE_M ){ MRef<SdpHeaderM *> offerM = (SdpHeaderM*)*(offer->getHeaders()[i]); const string &transport = offerM->getTransport(); if (transport != "RTP/AVP" && !securityConfig.secured && transport == "RTP/SAVP") { errorString += "No supported SRTP key exchange method"; return false; } MRef<SdpHeaderM *> answerM = new SdpHeaderM( offerM->getMedia(), 0, 0, offerM->getTransport() ); sdpAnswer->addHeader( *answerM ); for( j = 0; j < offerM->getNrFormats(); j++ ){ receiver = matchFormat( offerM, j, remoteAddress ); if( receiver ){ if( answerM->getPort() == 0 ){ answerM->setPort( receiver->getPort() ); } else{ /* This media has already been treated */ continue; } /* found a receiver, accept the offer */ //add the payload type to the offer, as accepted ... int payloadTypeAccepted = offerM->getFormat( j ); string payloadStr = itoa( payloadTypeAccepted ); answerM->addFormat( payloadTypeAccepted ); MRef<SdpHeaderA*> rtpmap = new SdpHeaderA("a=X"); MRef<SdpHeaderA*> fmtp = new SdpHeaderA("a=X"); rtpmap->setAttributes( "fmtp:" + payloadStr + " " + offerM->getRtpMap( payloadTypeAccepted ) ); fmtp->setAttributes( "rtpmap:" + payloadStr + " " + offerM->getRtpMap( payloadTypeAccepted ) ); answerM->addAttribute( *rtpmap ); answerM->addAttribute( *fmtp ); /* Additional attributes (framesize, ...) */ attributes = receiver->getSdpAttributes(); for( iAttribute = attributes.begin(); iAttribute != attributes.end(); iAttribute ++ ){ MRef<SdpHeaderA*> a = new SdpHeaderA("a=X"); a->setAttributes( *iAttribute ); answerM->addAttribute( *a ); } } } } } return true;}MRef<SdpPacket *> Session::getSdpAnswer(){// cerr << "Session::getSdpAnswer" << endl; if( securityConfig.secured ){ string keyMgmtAnswer; // Generate the key management answer message keyMgmtAnswer = responderParse(); if( !securityConfig.secured ){ // Something went wrong errorString = "Could not parse key management message."; fprintf(stderr, "responderParse failed\n" ); return NULL; } /* else{ if( ka && ka->type() == KEY_AGREEMENT_TYPE_DH ){ ((KeyAgreementDH *)*ka)->computeTgk(); } } */ sdpAnswer->setSessionLevelAttribute( "key-mgmt", "mikey "+keyMgmtAnswer ); } return sdpAnswer;}void Session::start(){ list< MRef<MediaStreamSender * > >::iterator iS; list< MRef<MediaStreamReceiver * > >::iterator iR; if( securityConfig.secured && ka && ka->type() == KEY_AGREEMENT_TYPE_DH ){#ifdef ENABLE_TS ts.save( TGK_START );#endif ((KeyAgreementDH *)*ka)->computeTgk();#ifdef ENABLE_TS ts.save( TGK_END );#endif } for( iR = mediaStreamReceivers.begin(); iR != mediaStreamReceivers.end(); iR++ ){ if( ! (*iR)->disabled ){ if( securityConfig.secured ){ (*iR)->setKeyAgreement( ka ); } (*iR)->start(); } } mediaStreamSendersLock.lock(); for( iS = mediaStreamSenders.begin(); iS != mediaStreamSenders.end(); iS++ ){ if( (*iS)->getPort() ){ if( securityConfig.secured ){ (*iS)->setKeyAgreement( ka ); } (*iS)->start(); } } mediaStreamSendersLock.unlock();}void Session::stop(){ list< MRef<MediaStreamSender * > >::iterator iS; list< MRef<MediaStreamReceiver * > >::iterator iR; for( iR = mediaStreamReceivers.begin(); iR != mediaStreamReceivers.end(); iR++ ){ if( ! (*iR)->disabled ){ (*iR)->stop(); } } mediaStreamSendersLock.lock(); for( iS = mediaStreamSenders.begin(); iS != mediaStreamSenders.end(); iS++ ){ if( (*iS)->getPort() ){ (*iS)->stop(); } } mediaStreamSendersLock.unlock();}void Session::addMediaStreamReceiver( MRef<MediaStreamReceiver *> mediaStream ){ mediaStreamReceivers.push_back( *mediaStream ); silenceSources( silencedSources );}void Session::addMediaStreamSender( MRef<MediaStreamSender *> mediaStream ){ mediaStreamSendersLock.lock(); mediaStream->setMuted( mutedSenders ); mediaStreamSenders.push_back( *mediaStream ); mediaStreamSendersLock.unlock();}string Session::getErrorString(){ return errorString;}uint16_t Session::getErrorCode(){ return errorCode;}bool Session::isSecure(){ return securityConfig.secured;}string Session::getCallId(){ return callId;}void Session::setCallId( const string callId ){ this->callId = callId;}void Session::sendDtmf( uint8_t symbol ){ MRef<DtmfSender *> dtmfSender = new DtmfSender( this ); uint32_t * ts = new uint32_t; *ts = 0; dtmfTOProvider->request_timeout( 0, dtmfSender, new DtmfEvent( symbol, 10, 0, false, true, ts ) ); dtmfTOProvider->request_timeout( 5, dtmfSender, new DtmfEvent( symbol, 10, 0, false, false, ts ) ); dtmfTOProvider->request_timeout( 10, dtmfSender, new DtmfEvent( symbol, 10, 0, false, false, ts ) ); dtmfTOProvider->request_timeout( 15, dtmfSender, new DtmfEvent( symbol, 10, 800, true, false, ts ) ); dtmfTOProvider->request_timeout( 20, dtmfSender, new DtmfEvent( symbol, 10, 800, true, false, ts ) ); dtmfTOProvider->request_timeout( 25, dtmfSender, new DtmfEvent( symbol, 10, 800, true, false, ts, true ) ); }void Session::muteSenders (bool mute) { mutedSenders = mute; mediaStreamSendersLock.lock(); for( std::list< MRef<MediaStreamSender *> >::iterator it = mediaStreamSenders.begin(); it != mediaStreamSenders.end(); it++ ) { (*it)->setMuted( mute ); } mediaStreamSendersLock.unlock(); }void Session::silenceSources ( bool silence ) {#ifdef DEBUG_OUTPUT/* if( silence ) cerr << "Session::SilenceSources - true" << endl; else cerr << "Session::SilenceSources - false" << endl;*/#endif silencedSources = silence; for( std::list< MRef<MediaStreamReceiver *> >::iterator it = mediaStreamReceivers.begin(); it != mediaStreamReceivers.end(); it++ ) { list<uint32_t> ssrcList; list<uint32_t>::iterator ssrcIt; MRef<AudioMedia *> audioMedia; MRef<AudioMediaSource *> audioSource; //obtain the media object used by the media stream, and try to cast it to //an audiomedia ... audioMedia = dynamic_cast<AudioMedia *>( *( (*it)->getMedia() ) ); //if it is not audiomedia, we are not interested if( !audioMedia ) { continue; } ssrcList = (*it)->getSsrcList(); for( ssrcIt = ssrcList.begin(); ssrcIt != ssrcList.end(); ssrcIt++ ) { audioSource = audioMedia->getSource( *ssrcIt ); if( !audioSource ) {// cerr << "Session::SilenceSources - skipping ssrc ... no source found" << endl; continue; } else { audioSource->setSilenced( silence );// cerr << "Session::SilenceSources - silencing source " << itoa(*ssrcIt) << endl; } } }}#ifdef DEBUG_OUTPUTstring Session::getDebugString() { string ret; ret = getMemObjectType() + ": this=" + itoa((int64_t)this) + "\n; callid=" + getCallId() + "; peerUri=" + peerUri; ret += "\n "; if( mutedSenders ) ret += "; mutedSenders = true"; else ret += "; mutedSenders = false"; ret += "\n "; if( silencedSources ) ret += "; silencedSources = true"; else ret += "; silencedSources = false"; for( std::list< MRef<MediaStreamReceiver *> >::iterator it = mediaStreamReceivers.begin(); it != mediaStreamReceivers.end(); it++ ) { ret += "\n" + (*it)->getDebugString(); } for( std::list< MRef<MediaStreamSender *> >::iterator it2 = mediaStreamSenders.begin(); it2 != mediaStreamSenders.end(); it2++ ) { ret += "\n" + (*it2)->getDebugString(); } return ret;}#endifvoid Session::clearMediaStreamReceivers() { mediaStreamReceivers.clear();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?