📄 siptransaction.cpp
字号:
#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 ®isterserver, 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 + -