📄 sipregister.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 + -