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

📄 siptransaction.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <qtimer.h>#include "sipuri.h"#include "sipcall.h"#include "sipmessage.h"#include "siptransaction.h"#include "sdpbuild.h"#include "../kphone/kstatics.h"SipTransaction::SipTransaction( unsigned int seqn, SipCallMember *farend, SipCall *call ){	responses.setAutoDelete( true );	parent = call;	requestmessage = NULL;	direction = None;	remote = farend;	seqnum = seqn;	int uniqid = rand();	branch.sprintf( "z9hG4bK%X", uniqid );	cancelled = false;	inviteRep = 7;	timer_202 = new QTimer( this );	connect( timer_202, SIGNAL( timeout() ), this, SLOT( send_202() ) );}SipTransaction::~SipTransaction( void ){	if( requestmessage ) {		delete requestmessage;	}	responses.clear();}QString SipTransaction::getCSeq( void ) const{	QString cseq;	cseq = QString::number( seqnum )		+ " " + Sip::getMethodString( requestmessage->getMethod() );	return cseq;}QString SipTransaction::getSeqMethod( void ) const{ 	return Sip::getMethodString( requestmessage->getMethod() );}void SipTransaction::setStatus( const SipStatus &stat ){	laststatus = stat;	statusUpdated();}bool SipTransaction::sendRequest( Sip::Method meth, const QString &body,		const MimeContentType &bodytype, const SipUri &referto,		const QString &proxyauthentication,const QString &authentication, const int expiresTime ){	if ( requestmessage == NULL ) {		direction = LocalRequest;	}	// Construct message	requestmessage = new SipMessage;	requestmessage->setType( SipMessage::Request );	requestmessage->setMethod( meth );	// Set Request Uri	if( meth != Sip::SUBSCRIBE ||	    remote->getCall()->getCallStatus() == SipCall::callDisconneting ||	    remote->getCall()->getCallStatus() == SipCall::callInProgress ) {		requestmessage->setRequestUri( remote->getContactUri() );	} else {		requestmessage->setRequestUri( remote->getUri() );	}	requestmessage->insertHeader( SipHeader::CSeq, getCSeq() );	if( ( meth != Sip::INVITE && meth != Sip::MESSAGE && meth != Sip::SUBSCRIBE && meth != Sip::CANCEL ) ||	    remote->getCall()->getCallStatus() == SipCall::callDisconneting ||	    remote->getCall()->getCallStatus() == SipCall::callInProgress ) {		requestmessage->insertHeader( SipHeader::To, remote->getUri().nameAddr() );	} else {		requestmessage->insertHeader( SipHeader::To, remote->getUri().nameAddr_noTag() );	}	if( meth == Sip::REFER && referto != SipUri::null ) {		requestmessage->insertHeader( SipHeader::Refer_To, referto.uri() );		requestmessage->insertHeader( SipHeader::Referred_By, parent->getContactUri().nameAddr() );	}	if( proxyauthentication != QString::null ) {		requestmessage->insertHeader( SipHeader::Proxy_Authorization, proxyauthentication );	}		if( authentication != QString::null ) {		requestmessage->insertHeader( SipHeader::Authorization, authentication );	}	if( expiresTime >= 0 ) {		QString strExpiresTime;		requestmessage->insertHeader( SipHeader::Expires, strExpiresTime.setNum( expiresTime ) );	}	if( meth == Sip::NOTIFY ) {		if ( expiresTime == 0) {			requestmessage->insertHeader( SipHeader::Subscription_State, "terminated;reason=deactivated" );		} else {            		requestmessage->insertHeader( SipHeader::Subscription_State, "active" );		}	}	if( bodytype != MimeContentType::null ) {		requestmessage->insertHeader( SipHeader::Content_Type, bodytype.type() );	}	requestmessage->setBody( body );	return parent->sendRequest( requestmessage, true, SipUri::null, branch );}void SipTransaction::sendResponse( const SipStatus &status, const QString &body, const MimeContentType &bodytype ){	SipMessage *response = new SipMessage;	setStatus( status ); // Update our status	responses.append( response ); // Save this response	response->setType( SipMessage::Response );	response->setStatus( status );	// Copy via list exactly	response->setViaList( requestmessage->getViaList() );	response->insertHeader( SipHeader::From, remote->getUri().nameAddr() );	response->insertHeader( SipHeader::CSeq, getCSeq() );	if( bodytype != MimeContentType::null ) {		response->insertHeader( SipHeader::Content_Type, bodytype.type() );	}	response->setBody( body );	parent->sendResponse( response );}void SipTransaction::sendResponseOP( const SipStatus &status, const QString &body ){	SipMessage *response = new SipMessage;	setStatus( status ); // Update our status	responses.append( response ); // Save this response	response->setType( SipMessage::Response );	response->setStatus( status );	// Copy via list exactly	response->setViaList( requestmessage->getViaList() );	response->insertHeader( SipHeader::From, remote->getUri().nameAddr() );	response->insertHeader( SipHeader::CSeq, getCSeq() );	response->insertHeader( SipHeader::Event, "registration" );	response->insertHeader( SipHeader::Allow_Events, "presence" );	response->insertHeader( SipHeader::Accept, "application/sdp");//	response->getContactList().addToHead(body);//	response->setBody( body );	parent->sendResponse( response );}void SipTransaction::sendResponseNC( const SipStatus &status, const QString &body, const MimeContentType &bodytype ){	SipMessage *response = new SipMessage;	setStatus( status ); // Update our status	responses.append( response ); // Save this response	response->setType( SipMessage::Response );	response->setStatus( status );	// Copy via list exactly	response->setViaList( requestmessage->getViaList() );	response->insertHeader( SipHeader::From, remote->getUri().nameAddr() );	response->insertHeader( SipHeader::CSeq, getCSeq() );	response->getContactList().addToHead(body);	parent->sendResponse( response, false );}void SipTransaction::sendRegister( const SipUri &registerserver,	int expiresTime, const QString &authentication,	const QString &proxyauthentication, const QString &body,	const MimeContentType &bodytype, const QString &qvalue ){	if ( requestmessage == NULL ) {		direction = LocalRequest;	}	// Create message	requestmessage = new SipMessage;	requestmessage->setType( SipMessage::Request );	requestmessage->setMethod( Sip::REGISTER );	requestmessage->setQvalue( qvalue );	// Set request URI	requestmessage->setRequestUri( registerserver );	requestmessage->insertHeader( SipHeader::CSeq, getCSeq() );	requestmessage->insertHeader( SipHeader::To, remote->getUri().nameAddr() );	if( authentication != QString::null ) {		requestmessage->insertHeader( SipHeader::Authorization, authentication );	}	if( proxyauthentication != QString::null ) {		requestmessage->insertHeader( SipHeader::Proxy_Authorization, proxyauthentication );	}	if( bodytype != MimeContentType::null ) {		requestmessage->insertHeader( SipHeader::Content_Type, bodytype.type() );	}	requestmessage->setBody( body );	if( expiresTime >= 0 ) {		QString strExpiresTime;		requestmessage->insertHeader( SipHeader::Expires, strExpiresTime.setNum( expiresTime ) );	}	parent->sendRequest( requestmessage, true, registerserver );}void SipTransaction::incomingResponse( SipMessage *message ){	responses.append( message );	// Grab tags	SipUri newto( message->getHeaderData( SipHeader::To ) );	remote->setUri( newto );	if( ( requestmessage->getMethod() == Sip::INVITE ) && ( message->getStatus().getCode() >= 200 ) ) {		sendRequest( Sip::ACK );	} else if( ( requestmessage->getMethod() == Sip::ACK ) && ( message->getStatus().getCode() >= 200 ) ) {		sendRequest( Sip::ACK );	}	setStatus( message->getStatus() );}QString SipTransaction::stateText( QString state ){	QString text;	if( state == "online" ) {		text = "Online";	} else if( state == "busy" ) {		text = "Busy";	} else if( state == "berightback" ) {		text = "Be Right Back";	} else if( state == "away" ) {		text = "Away";	} else if( state == "onthephone" ) {		text = "On The Phone";	} else if( state == "outtolunch" ) {		text = "Out To Lunch";	} else if( state == "offline" ) {		text = "Offline";	} else {		text = state;	}	return text;}void SipTransaction::incomingRequest( SipMessage *message,bool holdmaster ){	SdpBuild *optsdp = new SdpBuild ( 0 , 0 );	QString p;	if( ( message->getMethod() == Sip::ACK ) ) {		// Make sure listeners know in case there was a new session description		statusUpdated();		delete message;	} else if( ( message->getMethod() == Sip::CANCEL ) ) {		timer_202->stop();		if( !cancelled && requestmessage->getMethod() == Sip::INVITE ) {			sendResponse( SipStatus( 487 ) );		}		requestmessage->setMethod( Sip::CANCEL );		if( cancelled ) {			sendResponse( SipStatus( 481 ) );		} else {			sendResponse( SipStatus( 200 ) );		}		// Mark request as cancelled and inform listeners		cancelled = true;						statusUpdated();		delete message;	} else {		direction = RemoteRequest;		if( requestmessage ) {			delete requestmessage;		}		requestmessage = message;		switch( message->getMethod() ) {			case Sip::INVITE:			if( !((parent->getCallType()==SipCall::auviCall) ||(parent->getCallType() == SipCall::videoCall) || (parent->getCallType() >= SipCall::extCall1) ) ) {					parent->setCallType( SipCall::StandardCall );			}			sendResponse( SipStatus( 100 ) );			break;			case Sip::BYE:				if( parent->getCallType() == SipCall::UnknownCall ) {					parent->setCallType( SipCall::BrokenCall );				}				sendResponse( SipStatus( 200 ) );				break;			case Sip::OPTIONS:				if( parent->getCallType() == SipCall::UnknownCall ) {					parent->setCallType( SipCall::OptionsCall );				}//				sendResponse( SipStatus( 200 ), optsdp->prepOptString());				sendResponseOP( SipStatus( 200 ), optsdp->prepOptString());				break;			case Sip::MSG:				parent->setCallType( SipCall::MsgCall );				if( message->hasHeader( SipHeader::Subject ) ) {					parent->setSubject( message->getHeaderData( SipHeader::Subject ) );				}				sendResponse( SipStatus( 200 ) );				break;			case Sip::SUBSCRIBE:				if( parent->getCallType() == SipCall::inSubscribeCall ) {					if( message->hasHeader( SipHeader::Accept ) ) {						QString Accept = message->getHeaderData( SipHeader::Accept );						if( Accept.contains("application/pidf") ) {

⌨️ 快捷键说明

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