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

📄 siptransaction.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
📖 第 1 页 / 共 2 页
字号:
							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 + -