--- a/voipplugins/sipconnectionprovider/src/scpsipconnection.cpp Thu Aug 19 09:45:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1155 +0,0 @@
-/*
-* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: Interface to SIP profiles.
-*
-*/
-
-#include <sipprofileregistry.h>
-#include <sipprofile.h>
-#include <sipmanagedprofile.h>
-#include <sipmanagedprofileregistry.h>
-#include <sipconnection.h>
-#include <commdb.h>
-#include <ccherror.h>
-
-#include "scpsipconnection.h"
-#include "scplogger.h"
-#include "scpsipconnectionobserver.h"
-#include "scputility.h"
-#include "voipeventlog.h"
-
-// If EnableL fails a timeout for reporting error
-const TInt KEnableTimeout = 120000000;
-
-const TInt KUsernameMaxLength = 255;
-
-_LIT8( KSCPAt8, "@" );
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::CScpSipConnection
-// -----------------------------------------------------------------------------
-//
-CScpSipConnection::CScpSipConnection(
- TInt aProfileId,
- CSIPProfileRegistry& aProfileRegistry,
- CSIPManagedProfileRegistry& aManagedProfileRegistry,
- CSIP& aSip ) :
- iProfileId( aProfileId ),
- iProfileRegistry( aProfileRegistry ),
- iManagedProfileRegistry( aManagedProfileRegistry ),
- iSip( aSip ),
- iRegistrationRequestState( ENoRequest ),
- iConnectionStateError( KErrNone ),
- iReserved( EFalse ),
- iIapAvailableOffered( EFalse )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::CScpSipConnection profile id: %d",
- this, aProfileId );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::ConstructL()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ConstructL", this );
-
- iSipProfile = iProfileRegistry.ProfileL( iProfileId );
-
- if ( !iSipProfile )
- {
- User::Leave( KErrNotFound );
- }
-
- iEnableTimeoutTimer = CPeriodic::NewL( CPeriodic::EPriorityStandard );
-
- User::LeaveIfError( iConnectionMonitor.ConnectL() );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::NewL
-// -----------------------------------------------------------------------------
-//
-CScpSipConnection* CScpSipConnection::NewL(
- TInt aProfileId,
- CSIPProfileRegistry& aProfileRegistry,
- CSIPManagedProfileRegistry& aManagedProfileRegistry,
- CSIP& aSip )
- {
- SCPLOGSTRING( "CScpSipConnection::NewL" );
- __ASSERT_DEBUG( aProfileId > 0, User::Panic( KNullDesC, KErrGeneral ) );
-
- CScpSipConnection* self = new (ELeave) CScpSipConnection( aProfileId,
- aProfileRegistry,
- aManagedProfileRegistry,
- aSip );
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop( self );
-
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::~CScpSipConnection
-// -----------------------------------------------------------------------------
-//
-CScpSipConnection::~CScpSipConnection()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::~CScpSipConnection", this );
-
- delete iSipConnection;
- iConnectionMonitor.Close();
- delete iEnableTimeoutTimer;
- delete iSipProfile;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::AddObserver
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::AddObserver( MScpSipConnectionObserver& aObserver )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::AddObserverL: 0x%x",this, &aObserver );
-
- iObserver = &aObserver;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::RemoveObserver
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::RemoveObserver( MScpSipConnectionObserver& aObserver )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::RemoveObserver: 0x%x", this, &aObserver );
-
- if ( &aObserver == iObserver )
- {
- iObserver = NULL;
- return KErrNone;
- }
-
- return KErrNotFound;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::ProfileId
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::ProfileId() const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ProfileId", this );
-
- return iProfileId;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::EnableL
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::EnableL()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::EnableL", this );
-
- if ( iRegistrationRequestState != ERegistrationRequested )
- {
- iConnectionStateError = KErrNone;
- iRegistrationRequestState = ERegistrationRequested;
-
- TUint32 iapId( 0 );
- TUint32 snapId( 0 );
-
- TInt result = GetSnap( snapId );
-
- if ( result == KErrNotFound || snapId == 0 )
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::EnableL - SNAP not found", this );
- result = GetIap( iapId );
- }
-
- // If username is not set leave directly with KCCHErrorAuthenticationFailed
- if ( !IsUsernameSetL() )
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::EnableL - AuthenticationFailed !!!", this );
- User::Leave( KCCHErrorAuthenticationFailed );
- }
-
- iProfileRegistry.EnableL( *iSipProfile, *this );
-
- if ( !iSipConnection && 0 != iapId )
- {
- iSipConnection = CSIPConnection::NewL( iSip, iapId, *this );
- }
-
- TBool connectionAvailable = IsNetworkConnectionAvailable();
-
- if ( connectionAvailable )
- {
- TBool registered( EFalse );
- User::LeaveIfError( iSipProfile->GetParameter( KSIPProfileRegistered,
- registered ) );
-
- if ( !registered )
- {
- StartEnableTimeoutTimer( CScpSipConnection::EnableTimeout );
- }
- }
- else
- {
- iConnectionStateError = KCCHErrorNetworkLost;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::Disable
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::Disable()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::Disable", this );
-
- iRegistrationRequestState = EDeregistrationRequested;
-
- CancelEnableTimeoutTimer();
-
- delete iSipConnection;
- iSipConnection = NULL;
-
- TInt err = iProfileRegistry.Disable( *iSipProfile );
- TRAPD( err1, DisableAlwaysOnModeL() );
-
- if ( err == KErrNone )
- {
- err = err1;
- }
-
- return err;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::ForceDisable
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::ForceDisable()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ForceDisable", this );
-
- iRegistrationRequestState = EDeregistrationRequested;
- CancelEnableTimeoutTimer();
-
- delete iSipConnection;
- iSipConnection = NULL;
-
- TInt err = iProfileRegistry.ForceDisable( *iSipProfile );
- return err;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::DisableAlwaysOnModeL()
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::DisableAlwaysOnModeL()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::DisableAlwaysOnModeL", this );
-
- TBool autoRegistration( EFalse );
- User::LeaveIfError( iSipProfile->GetParameter( KSIPAutoRegistration,
- autoRegistration ) );
-
- if ( autoRegistration )
- {
- CSIPManagedProfile* profile = static_cast<CSIPManagedProfile*> ( iSipProfile );
- User::LeaveIfError( profile->SetParameter( KSIPAutoRegistration, EFalse ) );
- iManagedProfileRegistry.SaveL( *profile );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::RegistrationRequestState
-// -----------------------------------------------------------------------------
-//
-CScpSipConnection::TRegistrationRequestState
- CScpSipConnection::RegistrationRequestState() const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::RegistrationRequestState", this );
-
- return iRegistrationRequestState;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetState
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::GetState( CScpSipConnection::TConnectionState& aState,
- TInt& aError ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetState", this );
-
- aError = iConnectionStateError;
-
- TBool registered( EFalse );
- TInt result = iSipProfile->GetParameter( KSIPProfileRegistered, registered );
-
- if ( result == KErrNone )
- {
- switch ( iRegistrationRequestState )
- {
- case ENoRequest:
- if( registered )
- {
- aState = ERegistered;
- }
- else
- {
- aState = EDeregistered;
- }
- break;
-
- case ERegistrationRequested:
- if ( registered )
- {
- aState = ERegistered;
- }
- else
- {
- aState = ERegistering;
- }
- break;
-
- case EDeregistrationRequested:
- if ( registered )
- {
- aState = EDeregistering;
- }
- else
- {
- aState = EDeregistered;
- }
- break;
-
- default:
- __ASSERT_DEBUG( EFalse, User::Panic( KNullDesC, KErrGeneral ) );
- break;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::ProfileRegistryEventOccurred
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::ProfileRegistryEventOccurred(
- MSIPProfileRegistryObserver::TEvent aEvent )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::ProfileRegistryEventOccurred event: %d",
- this, aEvent );
-
- TScpConnectionEvent event( EScpUnknown );
-
- switch ( aEvent )
- {
- case MSIPProfileRegistryObserver::EProfileRegistered:
- {
- CancelEnableTimeoutTimer();
-
- delete iSipConnection;
- iSipConnection = NULL;
-
- iConnectionStateError = KErrNone;
- event = EScpRegistered;
- }
- break;
-
- case MSIPProfileRegistryObserver::EProfileDeregistered:
- {
- CancelEnableTimeoutTimer();
-
- if ( iRegistrationRequestState == EDeregistrationRequested )
- {
- iConnectionStateError = KErrNone;
- event = EScpDeregistered;
- }
- else
- {
-
- // SIP will still notify the client with
- // MSIPProfileRegistryObserver::ProfileRegistryEventOccurred( EProfileDeregistered )
- // but the reason for this event can be checked by the client
- // by calling CSIPProfileRegistryBase::LastRegistrationError.
- // If this function returns KErrDisconnected,
- // the client can determine that the reason for the event was that the network connection was dropped.
-
- TInt lastRegistrationError =
- iProfileRegistry.LastRegistrationError( *iSipProfile );
-
- SCPLOGSTRING2( " -> last registration error: %d", lastRegistrationError );
-
- if ( KErrDisconnected != lastRegistrationError )
- {
- if ( iProfileCurrentlyRoaming )
- {
- iProfileCurrentlyRoaming = EFalse;
- iConnectionStateError = KCCHErrorNetworkLost;
- event = EScpNetworkLost;
- }
- else
- {
- iConnectionStateError = KErrNone;
- event = EScpDeregistered;
- }
- }
- else
- {
- iConnectionStateError = KCCHErrorNetworkLost;
- event = EScpNetworkLost;
- }
- }
- }
- break;
-
- case MSIPProfileRegistryObserver::EProfileUpdated:
- {
- // Should we start EnableTimeoutTimer if registration
- // was requested?
-
- if ( iProfileCurrentlyRoaming )
- {
- iProfileCurrentlyRoaming = EFalse;
- iConnectionStateError = KErrNone;
- event = EScpRegistered;
- }
- }
- break;
-
- default:
- break;
- }
-
- if ( event != EScpUnknown && iObserver )
- {
- SCPLOGSTRING3( "id: %d HandleSipConnectionEvent event: %d",
- iProfileId, event );
-
- iObserver->HandleSipConnectionEvent( iProfileId, event );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::ProfileRegistryErrorOccurred
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::ProfileRegistryErrorOccurred( TInt aError )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::ProfileRegistryErrorOccurred error: %d",
- this, aError );
-
- CancelEnableTimeoutTimer();
-
- iConnectionStateError = TScpUtility::ConvertToCchError( aError );
- TScpConnectionEvent event = EScpUnknown;
- if ( iConnectionStateError == KCCHErrorAuthenticationFailed )
- {
- event = EScpAuthenticationFailed;
- }
- else if ( iConnectionStateError == KCCHErrorInvalidSettings )
- {
- event = EScpInvalidSettings;
- }
- else
- {
- if ( KErrCancel == aError )
- {
- iConnectionStateError = KErrCancel;
- event = EScpRegistrationCanceled;
- iRegistrationRequestState = EDeregistrationRequested;
- }
- else
- {
- iConnectionStateError = KCCHErrorLoginFailed;
- event = EScpRegistrationFailed;
- }
- }
-
- TInt error = KErrNone;
- CVoipEventLog* eventLog = NULL;
-
- TRAP( error, eventLog = CVoipEventLog::NewL() );
-
- if ( KErrNone == error )
- {
- eventLog->WriteError( aError );
- }
-
- delete eventLog;
-
- iObserver->HandleSipConnectionEvent( iProfileId, event );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::StartEnableTimeoutTimer
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::StartEnableTimeoutTimer( TInt (*aFunction)(TAny* aPtr) )
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::StartEnableTimeoutTimer", this );
- __ASSERT_DEBUG( !iEnableTimeoutTimer->IsActive(),
- User::Panic( KNullDesC, KErrGeneral ) );
-
- if ( !iEnableTimeoutTimer->IsActive() )
- {
- iEnableTimeoutTimer->Start( KEnableTimeout,
- 0,
- TCallBack( aFunction, this ) );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::CancelEnableTimeoutTimer
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::CancelEnableTimeoutTimer()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::CancelEnableTimeoutTimer", this );
-
- if ( iEnableTimeoutTimer->IsActive() )
- {
- iEnableTimeoutTimer->Cancel();
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::EnableTimeout
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::EnableTimeout( TAny* aSelf )
- {
- SCPLOGSTRING( "CScpSipConnection::EnableTimeout" );
-
- CScpSipConnection* self = static_cast<CScpSipConnection*>( aSelf );
-
- self->HandleEnableTimeout();
-
- return 0;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::HandleEnableTimeout
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::HandleEnableTimeout()
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::HandleEnableTimeout",
- this );
- ProfileRegistryErrorOccurred( EScpRegistrationFailed );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetIap
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::GetIap( TUint32& aIapId ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetIap", this );
-
- return iSipProfile->GetParameter( KSIPAccessPointId, aIapId );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetSnap
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::GetSnap( TUint32& aSnapId ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetSnap", this );
-
- return iSipProfile->GetParameter( KSIPSnapId, aSnapId );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetUsername
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::GetUsername( TDes8& aUsername ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetUsername", this );
-
- TInt result( KErrNotFound );
-
- // Check if profile is registered
- TBool val( EFalse );
- result = iSipProfile->GetParameter( KSIPProfileRegistered, val );
-
- const TDesC8* aor( NULL );
-
- // Get SIP's Username
- result = iSipProfile->GetParameter( KSIPUserAor, aor );
-
- if ( result == KErrNone && aor->Length() > KErrNone )
- {
- if ( aor->Length() <= aUsername.MaxLength() )
- {
- SCPLOGSTRING( "CScpSipConnection::GetUsername - Got username from AOR" );
- aUsername.Copy( *aor );
- }
- else
- {
- SCPLOGSTRING( "CScpSipConnection::GetUsername - KErrOverflow" );
- result = KErrOverflow;
- }
- }
- else if ( val ) // registered
- {
- // Might be IMS case and UserAor is incomplete, then
- // Get SIP's Username from registered AORs
- const MDesC8Array* aors = 0;
- result = iSipProfile->GetParameter( KSIPRegisteredAors, aors );
- if ( !aors || aors->MdcaCount() == 0 )
- {
- SCPLOGSTRING( "CScpSipConnection::GetUsername - KErrNotReady" );
- result = KErrNotReady;
- }
- else
- {
- TBuf8<KUsernameMaxLength> tmpUserName;
- tmpUserName.Copy( aors->MdcaPoint( 0 ) );
-
- #ifdef _DEBUG
- TBuf<KUsernameMaxLength> tmpUri;
- tmpUri.Copy( aors->MdcaPoint( 0 ) );
- SCPLOGSTRING2( "CScpSipConnection::GetUsername - use first registered AOR: %S", &tmpUri );
- #endif
-
- TInt atPos = tmpUserName.Find( KSCPAt8 );
- aUsername.Copy( tmpUserName.Left( atPos ) );
- }
- }
- SCPLOGSTRING2( "CScpSipConnection::GetUsername - return error: %d", result );
- return result;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetDomain
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::GetDomain( TDes8& aDomain ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetDomain", this );
-
- TInt result( KErrNotFound );
- const TDesC8* domain( NULL );
-
- // Get SIP's Username
- result = iSipProfile->GetParameter( KSIPRegistrar, KSIPServerAddress, domain );
-
- if ( result == KErrNone && domain )
- {
- if ( domain->Length() <= aDomain.MaxLength() )
- {
- aDomain.Copy( *domain );
- }
- else
- {
- result = KErrOverflow;
- }
- }
-
- return result;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetContactHeaderUser
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::GetContactHeaderUser( RBuf8& aContactHeaderUser ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetContactHeader", this );
-
- TInt result( KErrNotFound );
- const TDesC8* contactHeaderUser( NULL );
-
- // Get SIP's Username
- result = iSipProfile->GetParameter( KSIPContactHeaderUser, contactHeaderUser );
-
- if ( result == KErrNone && contactHeaderUser )
- {
- result = aContactHeaderUser.ReAlloc( contactHeaderUser->Length() );
- if ( KErrNone == result )
- {
- aContactHeaderUser.Copy( *contactHeaderUser );
- }
- }
-
- return result;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::SipProfile
-// -----------------------------------------------------------------------------
-//
-CSIPProfile& CScpSipConnection::SipProfile() const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::SipProfile", this );
-
- return *iSipProfile;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::SetIap
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::SetIap( TUint32 aProfileIapId )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::SetIap iap: %d",
- this, aProfileIapId );
-
- TInt result( KErrNone );
-
- // If snap exists, iap doesn't have an effect
- TUint32 snapId( 0 );
- result = GetSnap( snapId );
-
- if ( result == KErrNotFound ||
- snapId == 0 )
- {
- // Managed profile so we can change it
- CSIPManagedProfile* profile = static_cast<CSIPManagedProfile*> ( iSipProfile );
-
- // Add new IAP Id to SIP Profile
- result = profile->SetParameter( KSIPAccessPointId, aProfileIapId );
- if ( KErrNone == result )
- {
- // Save changes
- TRAP( result, iManagedProfileRegistry.SaveL( *profile ) );
- }
- }
- else
- {
- result = KErrNotSupported;
- }
-
- return result;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::SetIap
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::SetSnap( TUint32 aProfileSnapId )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::SetSnap snap: %d",
- this, aProfileSnapId );
-
- // Managed profile so we can change it
- CSIPManagedProfile* profile = static_cast<CSIPManagedProfile*> ( iSipProfile );
-
- // Add new SNAP Id to SIP Profile
- TInt result = profile->SetParameter( KSIPSnapId,
- aProfileSnapId );
-
- if ( KErrNone == result )
- {
- // Save changes
- TRAP( result, iManagedProfileRegistry.SaveL( *profile ) );
- }
-
- return result;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::GetIapTypeL
-// -----------------------------------------------------------------------------
-//
-TScpIapType CScpSipConnection::GetIapTypeL() const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::GetIapTypeL", this );
-
- TScpIapType type = EScpUnknownType;
-
- CCommsDatabase* commsDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
- CleanupStack::PushL( commsDb );
-
- CCommsDbTableView* iapTable = commsDb->OpenTableLC( TPtrC( IAP ) );
-
- if ( iapTable->GotoFirstRecord() == KErrNone )
- {
- TUint32 profilesIap = 0;
- User::LeaveIfError( GetIap( profilesIap ) );
-
- do
- {
- TUint32 uid = 0;
- iapTable->ReadUintL( TPtrC( COMMDB_ID ), uid );
-
- if ( uid == profilesIap )
- {
- // The length should be defined somewhere
- TBuf<256> serviceType;
- iapTable->ReadTextL( TPtrC( IAP_SERVICE_TYPE ), serviceType );
-
- if ( serviceType == TPtrC( INCOMING_GPRS ) ||
- serviceType == TPtrC( OUTGOING_GPRS ) ||
- serviceType == TPtrC( INCOMING_WCDMA) ||
- serviceType == TPtrC( OUTGOING_WCDMA) )
- {
- type = EScpGprs;
- }
- else if ( serviceType == TPtrC( LAN_SERVICE ) )
- {
- type = EScpWlan;
- }
- else
- {
- type = EScpUnknownType;
- }
-
- break;
- }
-
- }
- while( iapTable->GotoNextRecord() == KErrNone );
- }
-
- CleanupStack::PopAndDestroy( iapTable );
- CleanupStack::PopAndDestroy( commsDb );
-
- SCPLOGSTRING2( "GetIapTypeL result: %d", type );
-
- return type;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::SetReserved
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::SetReserved( TBool aReserved )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::SetReserved: %d", this, aReserved );
-
- iReserved = aReserved;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::Reserved
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::Reserved() const
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::Reserved: %d", this, iReserved );
-
- return iReserved;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::SetIapAvailableOffered
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::SetIapAvailableOffered( TBool aIapAvailableOffered )
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::SetIapAvailableOffered: %d",
- this, aIapAvailableOffered );
-
- iIapAvailableOffered = aIapAvailableOffered;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IapAvailableOffered
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::IapAvailableOffered() const
- {
- SCPLOGSTRING3( "CScpSipConnection[0x%x]::IapAvaiableOffered: %d",
- this, iIapAvailableOffered );
-
- return iIapAvailableOffered;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IapAvailableOffered
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::SetProfileCurrentlyRoaming()
- {
- SCPLOGSTRING( "CScpSipConnection[0x%x]::SetProfileCurrentlyRoaming" );
-
- iProfileCurrentlyRoaming = ETrue;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IsPasswordSet
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::IsPasswordSet() const
- {
- SCPLOGSTRING( "CScpSipConnection::IsPasswordSet" );
-
- // no support exist in sip for getting is password set information */
- SCPLOGSTRING( "CScpSipConnection::IsPasswordSet: pwd is set is always returned" );
- return ETrue;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IsUsernameSetL
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::IsUsernameSetL() const
- {
- SCPLOGSTRING( "CScpSipConnection::IsUsernameSetL" );
-
- TBool userNameSet( EFalse );
-
- // check from aor
- RBuf8 username;
- CleanupClosePushL( username );
- username.CreateL( KUsernameMaxLength );
-
- TInt err = GetUsername( username );
-
- if ( !err && username.Length() )
- {
- RBuf8 formattedUsername;
- TScpUtility::RemovePrefixAndDomain( username, formattedUsername );
-
- if ( formattedUsername.Length() )
- {
- userNameSet = ETrue;
- }
-
- formattedUsername.Zero();
- formattedUsername.Close();
- }
- else if ( KErrNone == err && SipProfileIMS() )
- {
- SCPLOGSTRING( "CScpSipConnection::IsUsernameSetL - SipProfileIMS" );
- // Check if this is IMS case; then we can think username is set
- // (SIP stack takes care of SIM handling)
- userNameSet = ETrue;
- }
-
- else
- {
- SCPLOGSTRING( "CScpSipConnection::IsUsernameSetL - ELSE!" );
- }
-
- CleanupStack::PopAndDestroy( &username );
-
- return userNameSet;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::SipProfileIMS
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::SipProfileIMS() const
- {
- SCPLOGSTRING( "CScpSipConnection::SipProfileIMS" );
- if( TSIPProfileTypeInfo::EIms == iSipProfile->Type().iSIPProfileClass )
- {
- SCPLOGSTRING( "CScpSipConnection::SipProfileIMS - ETrue" );
- return ETrue;
- }
- else
- {
- SCPLOGSTRING( "CScpSipConnection::SipProfileIMS - EFalse" );
- return EFalse;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::HandleMigrationStarted
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::HandleMigrationStarted()
- {
- if( iObserver )
- {
- SCPLOGSTRING2( " -> roaming - id: %d", iProfileId );
-
- iObserver->HandleSipConnectionEvent( iProfileId, EScpRoaming );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::HandleMigrationError
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::HandleMigrationError(
- TInt /*aError*/,
- TUint32 /*aProfileId*/,
- TUint32 /*aSnapId*/,
- TUint32 /*aIapId*/ )
- {
- // Migration has failed -> check is sip still registered via old iap
- // and if is, set state back to registered
-
- TScpConnectionEvent event( EScpUnknown );
-
- if ( iProfileCurrentlyRoaming && iObserver )
- {
- iProfileCurrentlyRoaming = EFalse;
- iConnectionStateError = KErrNone;
- event = EScpRegistered;
- SCPLOGSTRING3( "id: %d HandleSipConnectionEvent event: %d",
- iProfileId, event );
- iObserver->HandleSipConnectionEvent( iProfileId, event );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IsNetworkConnectionAvailable
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::IsNetworkConnectionAvailable() const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::IsNetworkConnectionAvailable", this );
-
- TBool isAvailable = EFalse;
-
- TUint32 snapId = 0;
- TInt result = GetSnap( snapId );
-
- if ( result == KErrNone ||
- result == KErrNotFound )
- {
- if ( snapId != 0 )
- {
- isAvailable = IsSnapConnectionAvailable( snapId );
- }
- else
- {
- TUint32 iapId = 0;
- result = GetIap( iapId );
-
- if( result == KErrNone )
- {
- isAvailable = IsIapConnectionAvailable( iapId );
- }
- }
- }
-
- return isAvailable;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IsSnapConnectionAvailable
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::IsSnapConnectionAvailable( TInt aSnapId ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::IsSnapConnectionAvailable", this );
-
- TBool isAvailable = EFalse;
-
- TConnMonSNAPInfoBuf snapInfoBuf;
- TRequestStatus status;
- iConnectionMonitor.GetPckgAttribute( EBearerIdAll, 0, KSNAPsAvailability,
- snapInfoBuf, status );
-
- User::WaitForRequest( status );
-
- for ( TInt i = 0; i < snapInfoBuf().Count(); i++ )
- {
- if ( aSnapId == snapInfoBuf().iSNAP[ i ].iSNAPId )
- {
- SCPLOGSTRING( "SNAP IS STILL ALIVE!!!" );
- isAvailable = ETrue;
- break;
- }
- }
-
- return isAvailable;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::IsIapConnectionAvailable
-// -----------------------------------------------------------------------------
-//
-TBool CScpSipConnection::IsIapConnectionAvailable( TInt aIapId ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::IsIapConnectionAvailable", this );
-
- TBool isAvailable = EFalse;
-
- TConnMonIapInfoBuf iapInfoBuf;
- TRequestStatus status;
- iConnectionMonitor.GetPckgAttribute( EBearerIdAll, 0, KIapAvailability,
- iapInfoBuf, status );
-
- User::WaitForRequest( status );
-
- for ( TInt i = 0; i < iapInfoBuf().Count(); i++ )
- {
- if ( aIapId == iapInfoBuf().iIap[ i ].iIapId )
- {
- SCPLOGSTRING( "IAP IS STILL ALIVE!!!" );
- isAvailable = ETrue;
- break;
- }
- }
-
- return isAvailable;
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::BearerFiltteringSetting
-// -----------------------------------------------------------------------------
-//
-TInt CScpSipConnection::BearerFiltteringSetting(
- TUint32& aBearerFilttering ) const
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::BearerFiltteringSetting - IN", this );
- return iSipProfile->GetParameter( KBearerType, aBearerFilttering );
- }
-
-// -----------------------------------------------------------------------------
-// CScpSipConnection::ConnectionStateChanged
-// -----------------------------------------------------------------------------
-//
-void CScpSipConnection::ConnectionStateChanged( CSIPConnection::TState aState )
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ConnectionStateChanged - IN", this );
-
- switch ( aState )
- {
- case CSIPConnection::EInactive:
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ConnectionStateChanged: EInactive", this );
-
- TUint32 iapId( 0 );
- TInt result = GetIap( iapId );
-
- if ( KErrNone == result && iSipConnection &&
- iapId == iSipConnection->IapId() &&
- KErrNone == iConnectionStateError )
- {
- delete iSipConnection;
- iSipConnection = NULL;
-
- iConnectionStateError = KCCHErrorLoginFailed;
- iObserver->HandleSipConnectionEvent( iProfileId, EScpRegistrationFailed );
- }
- }
- break;
-
- default:
- {
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ConnectionStateChanged: default", this );
- }
- break;
- }
- SCPLOGSTRING2( "CScpSipConnection[0x%x]::ConnectionStateChanged - OUT", this );
- }
-
-// End of File