voipplugins/sipconnectionprovider/src/scpsubservice.cpp
branchRCL_3
changeset 22 d38647835c2e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/sipconnectionprovider/src/scpsubservice.cpp	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,728 @@
+/*
+* 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<CScpPresenceHandler*>(
+                            &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<CScpPresenceHandler*>( &presenceSubService->ServiceHandler() );
+          SetSubServiceObserver( presenceHandler );
+        }
+    }
+
+// End of file