📄 siptransaction.cpp
字号:
parent->setPresBody(1); } else if( Accept.contains("application/watcherinfo") ) { parent->setPresBody(2); } else if(Accept.contains("application/xpidf") ) { parent->setPresBody(0); } else { parent->setPresBody(1); } } sendResponse( SipStatus( 202 ) ); } else if( parent->getCallType() == SipCall::inSubscribeCall_2 ) { sendResponse( SipStatus( 403 ) ); cancelled = true; } break; case Sip::NOTIFY: sendResponse( SipStatus( 200 ) ); if( message->getMethod() == Sip::NOTIFY ) { bool p = true; if( message->hasHeader( SipHeader::Subscription_State ) ) { QString HSubState = message->getHeaderData( SipHeader::Subscription_State ); if ( HSubState.contains("active") ) p = false;//if partner sends no body, presence info is kept if ( HSubState.contains("deactivated") ) { //partner terminated subscription, no presence available parent->setPresenceStatus ("offline"); parent->setBasePresenceStatus(false); return; } } int cont=0; if( message->hasHeader( SipHeader::Content_Type ) ) { QString Content = message->getHeaderData( SipHeader::Content_Type ); if( Content.contains("application/xpidf") ) { cont=1; } else { cont=2; } } QString m = message->messageBody(); if(cont==1) { parent->setBasePresenceStatus(true); QString subscript_stat; int idx = m.find("substatus="); if (idx != -1) { m = m.mid( idx + 11 ); parent->presenceStatus = stateText( m.left( m.find('"') ) ); } else { m = message->messageBody(); idx = m.find("status status="); if (idx != -1) { m = m.mid( idx + 15 ); parent->presenceStatus = m.left( m.find('"') ); } else { parent->setBasePresenceStatus(false); parent->presenceStatus = "Offline"; } } } else if (cont==2) { int idx; bool iac=false; m = message->messageBody(); QString pt = getxmls("pidf:data-model",m); pt+=":note>"; QString rp = getxmls("pidf:rpid",m); QString rpa= rp + ":activities>"; rp+=":user>"; QString ac = getxmls("pidf:rpid-status",m); QString ac1= ac+ ":activity>"; ac+= ":activities>"; //find the entry idx = m.find("basic>open"); if (idx != -1) { parent->setBasePresenceStatus(true); idx = m.find(pt); if (idx <0) { idx = m.find(rpa); iac=true; if (idx <0) { idx = m.find(ac); iac=false; if (idx <0) { idx = m.find(ac1); if (idx < 0) { idx = m.find(rp); if (idx < 0) { idx = m.find(":note>"); //last chance part 1 if (idx < 0) { idx = m.find("<note:");//last chance part 2 } } } } } } //grap the content if( idx != -1) { int idx1 = 0; QString m1=""; if(iac) { idx1 = m.find("<",idx); idx1 = m.find(":",idx1); m1 = m.mid( idx1+1); parent->setPresenceStatus (m1.left( m1.find("/>") )); } else { idx1 = m.find(">",idx); m1 = m.mid( idx1+1); parent->setPresenceStatus (m1.left( m1.find('<') )); } } else { parent->setPresenceStatus ("online"); } } else { parent->setPresenceStatus ("offline"); parent->setBasePresenceStatus(false); } } else { if (p) { parent->setPresenceStatus ("offline"); parent->setBasePresenceStatus(false); } } } break; default: break; } } delete optsdp;}void SipTransaction::incomingRequestRetransmission( SipMessage *message ){ SdpBuild *optsdp = new SdpBuild ( 0 , 0 ); QString p; if( ( message->getMethod() == Sip::CANCEL ) ) { sendResponse( SipStatus( 481 ) ); } else { switch( message->getMethod() ) { case Sip::INVITE: sendResponse( SipStatus( 100 ) ); break; case Sip::BYE: sendResponse( SipStatus( 200 ) ); break; case Sip::OPTIONS: sendResponseOP( SipStatus( 200 ), optsdp->prepOptString() ); break; case Sip::MSG: sendResponse( SipStatus( 200 ) ); break; case Sip::SUBSCRIBE: if( parent->getCallType() == SipCall::inSubscribeCall ) { sendResponse( SipStatus( 202 ) ); } else if( parent->getCallType() == SipCall::inSubscribeCall_2 ) { sendResponse( SipStatus( 403 ) ); } break; case Sip::NOTIFY: sendResponse( SipStatus( 200 ) ); break; default: break; } } delete optsdp; delete message;}bool SipTransaction::auditPending( void ){ struct timeval tv; struct timeval *reftv; unsigned int diff; if(KStatics::noLine == 1) inviteRep=1; if( ( laststatus.getCode() < 200 ) && ( direction == LocalRequest ) ) { // Check time gettimeofday( &tv, NULL ); reftv = requestmessage->getTimestamp(); // Check difference diff = ( tv.tv_sec - reftv->tv_sec ) * 1000 * 1000 + tv.tv_usec - reftv->tv_usec; diff = diff / 1000; // ms if( requestmessage->getMethod() != Sip::INVITE ) { if( diff > requestmessage->lastTimeTick() ) { if( (requestmessage->sendCount() == 11) || (inviteRep == 1) ) { if( requestmessage->getMethod() == Sip::SUBSCRIBE ) { remote->contactUpdate( false ); } remote->setIdle(); setStatus( SipStatus( 408 ) ); return false; } parent->sendRaw( requestmessage ); requestmessage->setTimestamp(); requestmessage->incrSendCount(); if( requestmessage->lastTimeTick() < 4000 ) { if( laststatus.getCode() < 100 ) { requestmessage->setTimeTick( 2 * requestmessage->lastTimeTick() ); } else { requestmessage->setTimeTick( 4000 ); } } return true; } } else { // INVITEs should be retransmitted differently if( laststatus.getCode() < 100 ) { if( diff > requestmessage->lastTimeTick() ) { // Timeout if ( requestmessage->sendCount() >= inviteRep ) { setStatus( SipStatus( 408 ) ); return false; } parent->sendRaw( requestmessage ); requestmessage->setTimestamp(); requestmessage->incrSendCount(); requestmessage->setTimeTick( 2 * requestmessage->lastTimeTick() ); return true; } } } } return false;}void SipTransaction::cancelRequest( const QString &body, const MimeContentType &bodytype ){ if(laststatus.getCode() != 408) { requestmessage->setMethod( Sip::CANCEL ); sendRequest( Sip::CANCEL, body, bodytype ); } else { inviteRep = 1; }}QString SipTransaction::getFinalMessageBody( void ){ if( responses.last() ) { if( responses.last()->haveBody() ) { return responses.last()->messageBody(); } } return QString::null;}MimeContentType SipTransaction::getFinalContentType( void ){ if( responses.last() ) { if( responses.last()->hasHeader( SipHeader::Content_Type ) ) { return MimeContentType( responses.last()->getHeaderData( SipHeader::Content_Type ) ); } } return MimeContentType::null;}SipUriList SipTransaction::getFinalContactList( void ){ if( responses.last() ) { return responses.last()->getContactList(); } return SipUriList::null;}QString SipTransaction::getFinalWWWAuthString( void ){ if( responses.last() ) { return responses.last()->getHeaderData( SipHeader::WWW_Authenticate ); } return QString::null;}QString SipTransaction::getRequestMessageBody( void ) const{ return requestmessage->messageBody();}MimeContentType SipTransaction::getRequestMessageContentType( void ) const{ if( requestmessage->hasHeader( SipHeader::Content_Type ) ) { return MimeContentType( requestmessage->getHeaderData( SipHeader::Content_Type ) ); } return MimeContentType::null;}QString SipTransaction::getFinalProxyAuthString( void ){ if( responses.last() ) { return responses.last()->getHeaderData( SipHeader::Proxy_Authenticate ); } return QString::null;}void SipTransaction::send_202( void ){ sendResponse( SipStatus( 202 ) );}QString SipTransaction::getxmls(const QString which, const QString mess) { int i0 = mess.find(which); int i1 = mess.findRev("xmlns:",i0); return mess.mid(i1+6, mess.find('=',i1)-i1-6);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -