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

📄 sipregister.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
字号:
#include <qmessagebox.h>#include <stdio.h>#include "../kphone/kstatics.h"#include "sipclient.h"#include "sipcall.h"#include "sipstatus.h"#include "siptransaction.h"#include "sipregister.h"#include "sipuser.h"SipRegister::SipRegister( SipUser *user, const SipUri &serveruri, int expires, QString qvalue ){	if (KStatics::debugLevel >=2) printf (":::::  SipRegister start\n");	qValue = qvalue;	autoregister = false;	if( expires > 0 && expires < minValidTime ) {		expires = minValidTime;	} else if( expires <= 0) {		expires = -1;	}	expiresTime = expires;	rstate = NotConnected;	regop = NoRegOpPending;	authtype = DigestAuthenticationRequired;	regUser = user;	regUser->addServer( this );	cleanRegister = false;	timer = new QTimer( this );	connect( timer, SIGNAL( timeout() ), this, SLOT( register_timeout() ) );	regcall = new SipCall( user, QString::null, SipCall::RegisterCall );	regcall->setSubject( "Register Call" );	outboundProxy = "";	if( !serveruri.getHostname().isEmpty() ) {		regserver = SipUri( serveruri.getHostname() );		setOutboundProxyUri( serveruri ); 	} else {		if( regserver.getHostname().isEmpty() ) {			regserver = SipUri( regUser->getMyUri()->getHostname() );		}	}	regCallMember = new SipCallMember(regcall,regserver );}SipRegister::~SipRegister( void ){	regUser->removeServer( this );	delete regCallMember;	delete regcall;	if (KStatics::debugLevel >=2)printf (":::::  SipRegister stop\n");}void SipRegister::setOutboundProxyUri( const SipUri &newregserver ){	outboundProxy = newregserver.proxyUri();}void SipRegister::requestRegister( const QString &username, const QString &password ){	if ( regop == NoRegOpPending ) {		regop = RegRequest;		if( !username.isEmpty() && !password.isEmpty() &&				( rstate == AuthenticationRequired ||				rstate == AuthenticationRequiredWithNewPassword ) ) {			//if (KStatics::debugLevel >=3) printf( "=====SipRegister: Authentication required\n" );			if( authtype == DigestAuthenticationRequired ) {				authresponse = Sip::getDigestResponse(					username, password, "REGISTER", regserver.uri(), authstr ,1);			} else if( authtype == BasicAuthenticationRequired ) {				authresponse = Sip::getBasicResponse( username, password );			} else if( authtype == ProxyDigestAuthenticationRequired ) {				proxyauthresponse = Sip::getDigestResponse(					username, password, "REGISTER", regserver.uri(), proxyauthstr );			} else if( authtype == ProxyBasicAuthenticationRequired ) {				proxyauthresponse = Sip::getBasicResponse( username, password );			}			rstate = TryingServerWithPassword;		} else {			rstate = TryingServer;		}		//if (KStatics::debugLevel >3) printf( "=====SipRegister: Auth is '%s'\n", authresponse.latin1() );		//if (KStatics::debugLevel >3) printf( "=====SipRegister: Proxy Auth is '%s'\n", proxyauthresponse.latin1() );		if( cleanRegister ) {			regop = RegClear;			curtrans = regcall->newRegister( regserver, regCallMember, 0, authresponse, proxyauthresponse );		} else {			curtrans = regcall->newRegister( regserver,  regCallMember,expiresTime, authresponse, proxyauthresponse, qValue );		}		cleanRegister = false;		connect( curtrans, SIGNAL( statusUpdated() ), this, SLOT( localStatusUpdated() ) );	}	statusUpdated();}void SipRegister::requestRegister( const SipUri & ){	statusUpdated();}void SipRegister::requestClearRegistration( void ){	if ( regop == NoRegOpPending ) {		timer->stop();      /* reregistration */		rstate = Disconnecting;		regop = RegClear;		cleanRegister = true;		curtrans = regcall->newRegister( regserver, regCallMember, 0 );		connect( curtrans, SIGNAL( statusUpdated() ), this, SLOT( localStatusUpdated() ) );	}	statusUpdated();}void SipRegister::localStatusUpdated( void ){	QString authstrtemp;	SipStatus status;	int validTime, exTime=expiresTime*900;	if( !curtrans ) {		if (KStatics::debugLevel >1) printf( "!!!!!SipRegister: Received what was likely a retransmission, badly ignoring...\n" );		return;	}	if( curtrans->getStatus().getCode() >= 200 ) { // final response		if( curtrans->getStatus().getCode() == 200 ) {			switch ( regop ) {				case RegRequest:					rstate = Connected;					status = curtrans->getStatus();					validTime = status.getValidTime();					if (exTime < validTime) validTime = exTime; // the min-expirestime is checked elsewhere!					if (KStatics::debugLevel >1) printf( "ReRegistrationTimer (ms): %d - %d\n", exTime,validTime);					timer->start( validTime, TRUE );					break;				case RegClear:					rstate = NotConnected;					break;				default:					break;			}		} else if( curtrans->getStatus().getCode() == 401 ) {			if (rstate == TryingServerWithPassword) {				rstate = AuthenticationRequiredWithNewPassword;			} else {				rstate = AuthenticationRequired;			}			authstr = curtrans->getFinalWWWAuthString();			authstrtemp = authstr.lower();			if( authstrtemp.contains( "digest" ) ) {				authtype = DigestAuthenticationRequired;			} else {				authtype = BasicAuthenticationRequired;			}			disconnect (curtrans, 0 , this, 0);			curtrans = 0;		} else if( curtrans->getStatus().getCode() == 407 ) {			if (rstate == TryingServerWithPassword) {				rstate = AuthenticationRequiredWithNewPassword;			} else {				rstate = AuthenticationRequired;			}			proxyauthstr = curtrans->getFinalProxyAuthString();			authstrtemp = proxyauthstr.lower();			if( authstrtemp.contains( "digest" ) ) {				authtype = ProxyDigestAuthenticationRequired;			} else {				authtype = ProxyBasicAuthenticationRequired;			}			disconnect (curtrans, 0 , this, 0);			curtrans = 0;		} else if( curtrans->getStatus().getCode() == 423 ) {			KStatics::noLine=0;			QString mess="Registration Failed,\n set expire time of registration to\n      " 				    + KStatics::minExT + "  sec.!!\n and restart the phone";			QMessageBox mb423( "KPhone", mess, 				QMessageBox::Critical, 				QMessageBox::Ok | QMessageBox::Default,0 ,0 );			mb423.exec();			rstate = NotConnected;		} else if( curtrans->getStatus().getCode() >= 400 ) {			KStatics::noLine=0;			QMessageBox mb( "KPhone",				"Registration Failed: " + SipStatus::codeString( curtrans->getStatus().getCode() ),				QMessageBox::Information,				QMessageBox::Ok | QMessageBox::Default,0 ,0 );			mb.exec();			rstate = NotConnected;					} else {			switch ( regop ) {				case RegRequest:				case RegClear:					rstate = Connected;					break;				default:					break;			}		}		regop = NoRegOpPending;	}	statusUpdated();}QString SipRegister::getAuthRealm( void ){	if( authstr.contains( "realm=\"" ) ) {		QString realm;		realm = authstr.mid( authstr.find( "realm=\"" ) + 7 );		realm = realm.left( realm.find( '\"' ) );		return realm;	}	return QString::null;}QString SipRegister::getProxyAuthRealm( void ){	if( proxyauthstr.contains( "realm=\"" ) ) {		QString realm;		realm = proxyauthstr.mid( authstr.find( "realm=\"" ) + 7 );		//if (KStatics::debugLevel >3) printf( "=====SipRegister: Realm is '%s'\n", realm.latin1() );		realm = realm.left( realm.find( '\"' ) );		return realm;	}	return QString::null;}void SipRegister::register_timeout(){	if (KStatics::debugLevel >3) printf( "=====SipRegister: Timeout\n" );	authresponse = QString::null;	rstate = Reconnecting;	requestRegister();}void SipRegister::updateRegister(){	if (KStatics::debugLevel >3) printf( "=====SipRegister: updateRegister\n" );	authresponse = QString::null;	rstate = Reconnecting;	requestRegister();}

⌨️ 快捷键说明

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