diff -r 65a3ef1d5bd0 -r f742655b05bf voipplugins/sipconnectionprovider/src/scpsubservice.cpp --- a/voipplugins/sipconnectionprovider/src/scpsubservice.cpp Thu Aug 19 09:45:22 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,728 +0,0 @@ -/* -* Copyright (c) 2005-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: -* -*/ - - -#include "scpsubservice.h" -#include "scpservice.h" -#include "scplogger.h" -#include "scputility.h" -#include "scpservicehandlerbase.h" -#include "scpprofilehandler.h" -#include "scpservicestorage.h" -#include "scpstatecontainer.h" -#include "scpvoiphandler.h" -#include "scpvmbxhandler.h" -#include "scppresencehandler.h" -#include "scpimhandler.h" -#include "scpsubserviceobserver.h" -#include "scppresencehandler.h" - -// ----------------------------------------------------------------------------- -// CScpSubService::NewL -// ----------------------------------------------------------------------------- -// -CScpSubService* CScpSubService::NewL( TInt aId, - TInt aSubServiceId, - TCCHSubserviceType aSubServiceType, - CScpService& aService ) - { - SCPLOGSTRING( "CScpSubService::CScpSubService" ); - - CScpSubService* self = new ( ELeave ) CScpSubService( aId, - aSubServiceId, - aSubServiceType, - aService ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ConstructL -// ----------------------------------------------------------------------------- -// -void CScpSubService::ConstructL() - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ConstructL", this ); - - switch( iSubServiceType ) - { - case ECCHVoIPSub: - iServiceHandler = CScpVoipHandler::NewL( *this ); - SetPresenceToObserveVoIP(); - break; - - case ECCHVMBxSub: - iServiceHandler = CScpVmbxHandler::NewL( *this ); - break; - - case ECCHIMSub: - iServiceHandler = CScpImHandler::NewL( *this ); - break; - - case ECCHPresenceSub: - iServiceHandler = CScpPresenceHandler::NewL( *this ); - break; - - default: - __ASSERT_DEBUG( EFalse, User::Panic( KNullDesC, KErrGeneral ) ); - User::Leave( KErrNotFound ); - break; - } - } - -// ----------------------------------------------------------------------------- -// CScpSubService::CScpSubService -// ----------------------------------------------------------------------------- -// -CScpSubService::CScpSubService( TInt aId, - TInt aSubServiceId, - TCCHSubserviceType aSubServiceType, - CScpService& aService ) : - iId( aId ), - iSubServiceId( aSubServiceId ), - iSubServiceType( aSubServiceType ), - iService( aService ), - iSipProfileId( 0 ), - iEnableRequestedState( EScpNoRequest ), - iSubServiceDisconnected( EFalse ), - iApId( 0 ), - iSnapId( 0 ), - iLastReportedError( KErrNone ), - iReserved( EFalse ), - iSubServiceState( TScpStateContainer::Instance( ECCHDisabled ) ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::CScpSubService type: %d", - this, aSubServiceType ); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::~CScpSubService -// ----------------------------------------------------------------------------- -// -CScpSubService::~CScpSubService() - { - SCPLOGSTRING2( "CScpSubService[0x%x]::~CScpSubService", this ); - - delete iServiceHandler; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::EnableL -// ----------------------------------------------------------------------------- -// -void CScpSubService::EnableL() - { - SCPLOGSTRING2( "CScpSubService[0x%x]::EnableL", this ); - - iSubServiceState->EnableL( *this ); - EnableOccured(); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::EnableOccured -// ----------------------------------------------------------------------------- -// -void CScpSubService::EnableOccured() - { - switch ( iSubServiceType ) - { - case ECCHPresenceSub: - { - iEnableCounter++; - } - break; - - case ECCHVoIPSub: - case ECCHIMSub: - case ECCHVMBxSub: - case ECCHUnknown: - default: - break; - } - - SCPLOGSTRING3( "CScpSubService[0x%x]::EnableOccured : %d", this, iEnableCounter ); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::EnableCounter -// ----------------------------------------------------------------------------- -// -TInt CScpSubService::EnableCounter() - { - SCPLOGSTRING3( "CScpSubService[0x%x]::EnableCounter : %d", this, iEnableCounter ); - return iEnableCounter; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ResetEnableCounter -// ----------------------------------------------------------------------------- -// -void CScpSubService::ResetEnableCounter() - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ResetEnableCounter", this ); - iEnableCounter = 0; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::Disable -// ----------------------------------------------------------------------------- -// -TInt CScpSubService::Disable() - { - SCPLOGSTRING2( "CScpSubService[0x%x]::Disable", this ); - - return iSubServiceState->Disable( *this ); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::Id -// ----------------------------------------------------------------------------- -// -TInt CScpSubService::Id() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::Id", this ); - - return iId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SubServiceId -// ----------------------------------------------------------------------------- -// -TInt CScpSubService::SubServiceId() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::SubServiceId", this ); - - return iSubServiceId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ServiceStorage -// ----------------------------------------------------------------------------- -// -CScpServiceStorage& CScpSubService::ServiceStorage() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ServiceStorage", this ); - - return iService.ServiceStorage(); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ProfileHandler -// ----------------------------------------------------------------------------- -// -CScpProfileHandler& CScpSubService::ProfileHandler() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ProfileHandler", this ); - - return iService.ProfileHandler(); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::State -// ----------------------------------------------------------------------------- -// -TCCHSubserviceState CScpSubService::State() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::State: %d", this ); - - return iSubServiceState->State(); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SubServiceType -// ----------------------------------------------------------------------------- -// -TCCHSubserviceType CScpSubService::SubServiceType() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::Type", this ); - - return iSubServiceType; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetSipProfileId -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetSipProfileId( TInt aSipProfileId ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetSipProfileId profile id", - this, aSipProfileId ); - - iSipProfileId = aSipProfileId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SipProfileId -// ----------------------------------------------------------------------------- -// -TInt CScpSubService::SipProfileId() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::SipProfileId", this ); - - return iSipProfileId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::EnableRequestedState -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetEnableRequestedState( TEnableState aEnableRequestedState ) - { - SCPLOGSTRING2( "CScpSubService[0x%x]::SetEnableRequestedState", this ); - - iEnableRequestedState = aEnableRequestedState; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::EnableRequestedState -// ----------------------------------------------------------------------------- -// -CScpSubService::TEnableState CScpSubService::EnableRequestedState() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::EnableRequestedState", this ); - - return iEnableRequestedState; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetSubServiceDisconnected -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetSubServiceDisconnected( TBool aSubServiceDisconnected ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetSubServiceDisconnected: %d", this, - aSubServiceDisconnected ); - - iSubServiceDisconnected = aSubServiceDisconnected; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SubServiceDisconnected -// ----------------------------------------------------------------------------- -// -TBool CScpSubService::SubServiceDisconnected() const - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SubServiceDisconnected: %d", this, - iSubServiceDisconnected ); - - return iSubServiceDisconnected; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetApId -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetApId( TUint32 aApId ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetApId ap id: %d", this, aApId ); - - iApId = aApId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ApId -// ----------------------------------------------------------------------------- -// -TUint32 CScpSubService::ApId() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ApId", this ); - - return iApId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetSnapId -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetSnapId( TUint32 aSnapId ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetSnapId snap id: %d", this, aSnapId ); - - iSnapId = aSnapId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SnapId -// ----------------------------------------------------------------------------- -// -TUint32 CScpSubService::SnapId() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::SnapId", this ); - - return iSnapId; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::GetIapType -// ----------------------------------------------------------------------------- -// -TScpIapType CScpSubService::GetIapType() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::GetIapType", this ); - - TScpIapType type = EScpUnknownType; - - // Check that the sip profile is not using WLAN iap - CScpProfileHandler& profileHandler = iService.ProfileHandler(); - - CScpSipConnection* sipConnection = NULL; - - if( profileHandler.SipConnectionExists( iSipProfileId ) ) - { - sipConnection = profileHandler.GetSipConnection( iSipProfileId ); - } - else - { - TRAP_IGNORE( sipConnection = - profileHandler.CreateSipConnectionL( iSipProfileId ) ); - } - - __ASSERT_DEBUG( sipConnection, User::Panic( KNullDesC, KErrGeneral ) ); - - if( sipConnection ) - { - TRAP_IGNORE( type = sipConnection->GetIapTypeL() ); - } - - return type; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ServiceHandler -// ----------------------------------------------------------------------------- -// -CScpServiceHandlerBase& CScpSubService::ServiceHandler() const - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ServiceHandler", this ); - - return *iServiceHandler; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::LastReportedError -// ----------------------------------------------------------------------------- -// -TInt CScpSubService::LastReportedError() const - { - SCPLOGSTRING3( "CScpSubService[0x%x]::LastReportedError: %d", - this, iLastReportedError ); - - return iLastReportedError; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetLastReportedError -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetLastReportedError( - const TInt aError ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetLastReportedError: %d", - this, aError ); - - iLastReportedError = aError; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetReserved -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetReserved( TBool aReserved ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetReserved: %d", this, aReserved ); - - iReserved = aReserved; - - CScpProfileHandler& profileHandler = iService.ProfileHandler(); - profileHandler.SetSipProfileReserved( iSipProfileId, iReserved ); - } - -// ----------------------------------------------------------------------------- -// CScpSubService::IsReserved -// ----------------------------------------------------------------------------- -// -TBool CScpSubService::IsReserved() const - { - SCPLOGSTRING3( "CScpSubService[0x%x]::IsReserved: %d", this, iReserved ); - - return iReserved; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::IsRoaming -// ----------------------------------------------------------------------------- -// -TBool CScpSubService::IsRoaming() const - { - SCPLOGSTRING3( "CScpSubService[0x%x]::IsRoaming: %d", this, iRoaming ); - - return iRoaming; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::ChangeState -// ----------------------------------------------------------------------------- -// -void CScpSubService::ChangeState( TCCHSubserviceState aState, TInt aError ) - { - SCPLOGSTRING5( "CScpSubService[0x%x]::ChangeState from %d to %d error: %d", this, - iSubServiceState->State(), aState, aError ); - SCPLOGSTRING3( "CScpSubService[0x%x]::ChangeState type %d", this, iSubServiceType ); - __ASSERT_DEBUG( aState != ECCHUninitialized, User::Panic( KNullDesC, KErrGeneral ) ); - - __ASSERT_DEBUG( iSubServiceState->State() == ECCHDisabled ? - aState != ECCHDisconnecting : ETrue, - User::Panic( KNullDesC, KErrGeneral ) ); - __ASSERT_DEBUG( iSubServiceState->State() == ECCHConnecting ? - aState != ECCHDisabled || KErrCancel == aError : ETrue, - User::Panic( KNullDesC, KErrGeneral ) ); - __ASSERT_DEBUG( iSubServiceState->State() == ECCHDisconnecting ? - aState == ECCHDisabled : ETrue, - User::Panic( KNullDesC, KErrGeneral ) ); - __ASSERT_DEBUG( iSubServiceState->State() == ECCHEnabled ? - aState != ECCHDisabled : ETrue, - User::Panic( KNullDesC, KErrGeneral ) ); - - if ( aState != iSubServiceState->State() || - ( aState == iSubServiceState->State() && iLastReportedError != aError ) ) - { - iLastReportedError = aError; - - switch( aState ) - { - case ECCHConnecting: - { - iSubServiceState = - TScpStateContainer::Instance( ECCHConnecting ); - } - break; - - case ECCHEnabled: - { - iSubServiceState = - TScpStateContainer::Instance( ECCHEnabled ); - - if ( ECCHVoIPSub == iSubServiceType ) - { - if ( iService.ContainsSubServiceType( ECCHPresenceSub ) ) - { - CScpPresenceHandler* presenceHandler = static_cast( - &iService.GetSubServiceByType( ECCHPresenceSub )->ServiceHandler() ); - - TRAP_IGNORE( presenceHandler->UpdateXdmSettingsL() ); - } - } - } - break; - - case ECCHDisconnecting: - { - iSubServiceState = - TScpStateContainer::Instance( ECCHDisconnecting ); - } - break; - - case ECCHDisabled: - { - iSubServiceState = - TScpStateContainer::Instance( ECCHDisabled ); - } - break; - - default: - __ASSERT_DEBUG( EFalse, User::Panic( KNullDesC, KErrGeneral ) ); - break; - - } - - TBool sendEvent = ETrue; - - // During connection refreshing we don't send events about disabling - if ( iEnableRequestedState == EScpRefreshed ) - { - if ( aState == ECCHDisconnecting || aState == ECCHDisabled ) - { - sendEvent = EFalse; - } - } - - if ( sendEvent ) - { - TServiceSelection selection( iSubServiceId, iSubServiceType ); - - MCchServiceObserver& observer = iService.ServiceObserver(); - observer.ServiceStateChanged( selection, - aState, - aError ); - - if ( ECCHDisabled == aState ) - { - ResetEnableCounter(); - // No need to hold the last reported error, if all - // subservices are in disabled state - if ( iService.IsAllSubservicesDisabled() ) - { - iService.ChangeLastReportedErrors( KErrNone ); - } - } - } - - if ( iSubServiceObserver ) - { - SCPLOGSTRING2( "CScpSubService[0x%x]::ChangeState HandleSubServiceChange", this ); - iSubServiceObserver->HandleSubServiceChange( aState, aError ); - } - } - } - -// ----------------------------------------------------------------------------- -// CScpSubService::HandleConnectionEvent -// ----------------------------------------------------------------------------- -// -void CScpSubService::HandleConnectionEvent( TScpConnectionEvent aEvent ) - { - SCPLOGSTRING4( "CScpSubService[0x%x]::HandleConnectionEvent event: %d state: %d", - this, aEvent, iSubServiceState->State() ); - __ASSERT_DEBUG( aEvent != EScpUnknown, User::Panic( KNullDesC, KErrGeneral ) ); - - // All other events than EScpRoaming finish roaming - iRoaming = EFalse; - - switch ( aEvent ) - { - case EScpNetworkFound: - { - iSubServiceState->NetworkFound( *this ); - } - break; - - case EScpNetworkNotFound: - { - iSubServiceState->NetworkNotFound( *this ); - } - break; - - case EScpNetworkLost: - { - iSubServiceState->NetworkLost( *this ); - } - break; - - case EScpRegistered: - { - iSubServiceState->ServiceConnected( *this ); - } - break; - - case EScpRegistrationFailed: - { - iSubServiceState->ServiceConnectionFailed( *this ); - } - break; - case EScpInvalidSettings: - { - iSubServiceState->ServiceInvalidSettings( *this ); - } - break; - case EScpDeregistered: - { - iSubServiceState->ServiceDisconnected( *this ); - } - break; - - case EScpAuthenticationFailed: - { - iSubServiceState->AuthenticationFailed( *this ); - } - break; - - case EScpRoaming: - { - iRoaming = ETrue; - iSubServiceState->Roaming( *this ); - } - break; - - case EScpRegistrationCanceled: - { - iSubServiceState->ServiceConnectionCanceled( *this ); - } - break; - - case EScpRegistrationPending: - { - iSubServiceState->RegistrationPending( *this ); - } - break; - - default: - __ASSERT_DEBUG( EFalse, User::Panic( KNullDesC, KErrGeneral ) ); - break; - } - - // Remove user disabled sub services if correct - // network event received - if ( iEnableRequestedState == EScpDisabled && - ( aEvent == EScpDeregistered || - aEvent == EScpRegistrationFailed || - aEvent == EScpNetworkLost || - aEvent == EScpNetworkNotFound ) ) - { - CScpServiceStorage& storage = ServiceStorage(); - storage.RemoveDisabledServices(); - } - else if ( iEnableRequestedState == EScpRefreshed && - aEvent == EScpDeregistered ) - { - // We can only ingnore the error - TRAP_IGNORE( EnableL() ); - } - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetSubServiceObserver -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetSubServiceObserver( MScpSubServiceObserver* aSubServiceObserver ) - { - SCPLOGSTRING3( "CScpSubService[0x%x]::SetSubServiceObserver aSubServiceObserver[0x%x]", - this, aSubServiceObserver ); - - iSubServiceObserver = aSubServiceObserver; - } - -// ----------------------------------------------------------------------------- -// CScpSubService::SetPresenceToObserveVoIPL -// ----------------------------------------------------------------------------- -// -void CScpSubService::SetPresenceToObserveVoIP() - { - SCPLOGSTRING2( "CScpSubService[0x%x]::SetPresenceToObserveVoIP", this ); - CScpSubService* presenceSubService = iService.GetSubServiceByType( ECCHPresenceSub ); - if ( presenceSubService ) - { - SCPLOGSTRING( "CScpSubService::SetPresenceToObserveVoIPL - presenceSubService exists" ); - CScpPresenceHandler* presenceHandler = - static_cast( &presenceSubService->ServiceHandler() ); - SetSubServiceObserver( presenceHandler ); - } - } - -// End of file