convergedconnectionhandler/cchserver/src/cchservicehandler.cpp
changeset 17 6d0b9f605b61
parent 2 7b872347d83b
--- a/convergedconnectionhandler/cchserver/src/cchservicehandler.cpp	Tue Feb 02 00:05:57 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1748 +0,0 @@
-/*
-* Copyright (c) 2007-2009 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:  CCCHServiceHandler implementation
-*
-*/
-
-
-// INCLUDE FILES
-#include <cchclientserver.h>
-#include <spnotifychange.h>
-
-#include "cchservicehandler.h"
-#include "cchserverbase.h"
-#include "cchspshandler.h"
-#include "cchlogger.h"
-#include "cchpluginhandler.h"
-#include "cchuihandler.h"
-#include "cchconnmonhandler.h"
-#include "cchwlanextension.h"
-#include "cchcommdbwatcher.h"
-#include "cchcommdbwatcherobserver.h"
-
-// EXTERNAL DATA STRUCTURES
-// None
-
-// EXTERNAL FUNCTION PROTOTYPES
-// None
-
-// CONSTANTS
-
-const TInt KConnectionRecoveryMaxTries = 5;
-
-const TInt KCCHFirstRecovery    = 15000000;
-const TInt KCCHSecondRecovery   = 15000000;
-const TInt KCCHThirdRecovery    = 30000000;
-const TInt KCCHFourthRecovery   = 60000000;
-const TInt KCCHFifthRecovery    = 60000000;
-
-const TInt KCCHPluginUnloadTimeout = 5000000;
-// MACROS
-// None
-
-// LOCAL CONSTANTS AND MACROS
-// None
-
-// MODULE DATA STRUCTURES
-// None
-
-// LOCAL FUNCTION PROTOTYPES
-// None
-
-// FORWARD DECLARATIONS
-// None.
-
-// ============================= LOCAL FUNCTIONS =============================
-
-// ============================ MEMBER FUNCTIONS =============================
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::CCCHServiceHandler
-// C++ default constructor can NOT contain any code, that might leave.
-// ---------------------------------------------------------------------------
-//
-CCCHServiceHandler::CCCHServiceHandler( CCCHServerBase& aServer ) :
-    iServer( aServer ),
-    iConnectionRecoveryTry( 0 ),
-    iCancelNotify( ETrue ) 
-    {
-    // No implementation required
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::ConstructL
-// Symbian 2nd phase constructor can leave.
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::ConstructL()
-    {
-    iNotifier = CSPNotifyChange::NewL( *this );
-    iCchUIHandler = CCchUIHandler::NewL( iServer, *this );
-    iPhoneStartupMonitor = CCchPhoneStartupMonitor::NewL( *iCchUIHandler );
-    iConnectionRecoveryTimer = CPeriodic::NewL( CPeriodic::EPriorityStandard );
-    iCommDbWatcher = CCCHCommDbWatcher::NewL( *this );
-    iPluginUnloadTimer = CPeriodic::NewL( CPeriodic::EPriorityStandard );
-    iRecoveryInterval.Append( KCCHFirstRecovery );
-    iRecoveryInterval.Append( KCCHSecondRecovery );
-    iRecoveryInterval.Append( KCCHThirdRecovery );
-    iRecoveryInterval.Append( KCCHFourthRecovery );
-    iRecoveryInterval.Append( KCCHFifthRecovery );
-    iWlanExtension = CCchWlanExtension::NewL( );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::NewL
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-//
-CCCHServiceHandler* CCCHServiceHandler::NewL( CCCHServerBase& aServer )
-    {
-    CCCHServiceHandler* self = CCCHServiceHandler::NewLC( aServer );
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::NewLC
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-//
-CCCHServiceHandler* CCCHServiceHandler::NewLC( CCCHServerBase& aServer )
-    {
-    CCCHServiceHandler* self = new (ELeave) CCCHServiceHandler( aServer );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    return self;
-    }
-
-// Destructor
-CCCHServiceHandler::~CCCHServiceHandler()
-    {
-    if ( iCchUIHandler )
-        {
-        iCchUIHandler->Destroy();
-        }
-
-    delete iPhoneStartupMonitor;
-    delete iWlanExtension;
-    delete iConnectionRecoveryTimer;
-    delete iPluginUnloadTimer;
-    delete iCommDbWatcher;
-
-    if( iNotifier )
-        {
-        iNotifier->Cancel();
-        delete iNotifier;
-        iNotifier = NULL;    
-        }
-
-    iServiceIds.Close();
-    iServer.PluginHandler().RemoveServiceNotifier( this );
-    iServices.ResetAndDestroy();
-    iServicesInRecovery.Close();
-    iRecoveryInterval.Close();
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::InitServiceHandlerL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::InitServiceHandlerL()
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler::InitServiceHandlerL [0x%x]: IN",this );
-    
-    RArray<TUint> serviceIds;
-    CleanupClosePushL( serviceIds );
-    iServer.SPSHandler().GetServiceIdsL( serviceIds );
-    for ( TInt i( 0 ); i < serviceIds.Count(); i++ )
-        {        
-        if ( KErrNotFound == FindService( serviceIds[ i ] ) )
-            {
-            TCCHService service;
-            TRAPD( error, iServer.SPSHandler().GetServiceInfoL( 
-                serviceIds[ i ], service ) );
-            if ( KErrNone == error )
-                {
-                AddServiceL( service );    
-                }                    
-            }
-        }
-    CleanupStack::PopAndDestroy( &serviceIds );
-    // Subscribe to service change notifies    
-    EnableNotifyChange();
-    
-    CCHLOGSTRING( "CCCHServiceHandler::InitServiceHandlerL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::AddServiceL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::AddServiceL( TCCHService& aService )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::AddServiceL: IN" );
-    
-    CCCHServiceInfo* cchServiceInfo = CCCHServiceInfo::NewLC( iServer );
-    cchServiceInfo->SetServiceId( aService.iServiceId );
-    cchServiceInfo->SetName( aService.iServiceName );
-    CCHLOGSTRING2( "CCCHServiceHandler::AddServiceL: adding service with %d subservices",aService.iSubservices.Count() );
-    for ( TInt i( 0 ); i < aService.iSubservices.Count(); i++ )
-        {
-        cchServiceInfo->AddSubserviceL( aService.iSubservices[ i ] );
-        }
-        
-    CleanupStack::Pop( cchServiceInfo );
-    iServices.Append( cchServiceInfo );
-    
-    CCHLOGSTRING( "CCCHServiceHandler::AddServiceL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::UpdateL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::UpdateL( TBool aReadSettingTable )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::UpdateL: IN" );
-    
-    // Read settings from service table
-    if ( aReadSettingTable )
-        {
-        RArray<TUint> serviceIds;
-        CleanupClosePushL( serviceIds );
-        
-        TInt index( KErrNotFound );
-        iServer.SPSHandler().GetServiceIdsL( serviceIds );
-        
-        for ( TInt i( 0 ); i < serviceIds.Count(); i++ )
-            {        
-            index = FindService( serviceIds[ i ] );
-            if ( KErrNotFound != index )
-                {
-                iServices[ index ]->UpdateL( ETrue );
-                }
-            else
-                {
-                CCHLOGSTRING2
-                    ( "CCCHSeviceHandler::UpdateL: \
-                        New service found: ServiceId %d", serviceIds[ i ] );
-                TCCHService service;
-                TRAPD( error, iServer.SPSHandler().GetServiceInfoL( 
-                    serviceIds[ i ], service ) );
-                if ( KErrNone == error )
-                    {
-                    AddServiceL( service );
-                    }                
-                }
-            }
-        if ( serviceIds.Count() < iServices.Count() )
-            {
-            // Remove service's which does not exist anymore            
-            for ( TInt i( 0 ); i < iServices.Count(); i++ )
-                {            
-                if ( KErrNotFound == serviceIds.Find( 
-                    iServices[ i ]->GetServiceId( ) ) )
-                    {
-                    CCHLOGSTRING2
-                        ( "CCCHSeviceHandler::UpdateL: \
-                        service removed: ServiceId %d", 
-                        iServices[ i ]->GetServiceId() );
-                    delete iServices[ i ];
-                    iServices.Remove( i );
-                    i--;
-                    StartPluginUnloadTimer( );
-                    }
-                }
-            }
-        CleanupStack::PopAndDestroy( &serviceIds );
-        }
-    else
-        {
-        for ( TInt i( 0 ); i < iServices.Count(); i++ )
-            {
-            iServices[ i ]->UpdateL();
-            }    
-        }
-    
-    CCHLOGSTRING( "CCCHServiceHandler::UpdateL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::IsStartupFlagSet
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::IsStartupFlagSet() const
-    {
-    TBool ret( EFalse );
-
-    for ( TInt i( 0 ); i < iServices.Count() && !ret; i++ )
-        {
-        ret = iServices[ i ]->StartupFlagSet();
-        }
-        
-    CCHLOGSTRING2( "CCCHServiceHandler::IsStartupFlagSet: %d", ret );
-    return ret;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::IsRecoveryNeeded
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::IsRecoveryNeeded( 
-                               const TCCHSubserviceState aState, 
-                               TInt aError )
-    {
-    TBool recover( EFalse );
-    CCHLOGSTRING( "CCCHServiceHandler::IsRecoveryNeeded: IN" );
-    if( !iServer.FeatureManager().OfflineMode() &&
-        ECCHConnecting == aState && ( 
-        KCCHErrorNetworkLost == aError || 
-        KCCHErrorServiceNotResponding == aError ) &&
-        !iConnectionRecoveryTimer->IsActive() )
-        {
-        recover = ETrue;            
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::IsRecoveryNeeded: OUT, value=%d", recover );
-    return recover;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::StateChangedL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::StateChangedL( const TUint aServiceId,
-                                        const TCCHSubserviceType aType,
-                                        const TCCHSubserviceState aState,
-                                        const TInt aError )
-    {
-    
-    CCHLOGSTRING( "CCCHServiceHandler::StateChanged: IN" );
-    CCHLOGSTRING2( "CCCHServiceHandler::StateChanged: service id;        %d",aServiceId );
-    CCHLOGSTRING2( "CCCHServiceHandler::StateChanged: service type;      %d",aType );
-    CCHLOGSTRING2( "CCCHServiceHandler::StateChanged: service new state; %d",aState );
-    CCHLOGSTRING2( "CCCHServiceHandler::StateChanged: service error;     %d",aError );
-    TInt index( FindService( aServiceId ) );
-    if ( KErrNotFound != index )
-        {
-        iServices[ index ]->SetErrorL( aType, aError );
-        iServices[ index ]->SetStateL( aType, aState );
-        //toggle voip indicator & emergency note if needed
-        if( ECCHVoIPSub == aType )
-            {
-            iCchUIHandler->UpdateUI( );
-            }
-        
-        // Check for possible first usage of GPRS (roaming cost warning)
-        TServiceConnectionInfo serviceConnInfo( aServiceId, aType, 0, 0 );
-        GetConnectionInfo( serviceConnInfo );
-        
-        if ( serviceConnInfo.iIapId && ECCHEnabled == aState )
-            {
-            if( !iCommDbWatcher->IsWlanApL( serviceConnInfo.iIapId ) )
-                {                
-                iCchUIHandler->CheckGprsFirstUsageL();
-                }
-            }
-        
-        //unload useless plugins    
-        if( ECCHDisabled == aState )
-            {
-            StartPluginUnloadTimer( );
-            }
-        //start fast recovery if not started
-        else if( IsRecoveryNeeded( aState, aError ) )
-            {
-            CCHLOGSTRING( "CCCHServiceHandler::StateChangedL network lost, starting recovery" );
-            iServicesInRecovery.Append( TServiceSelection( aServiceId, aType ) );
-            StartConnectionRecoveryTimer( CCCHServiceHandler::ConnectionRecoveryEvent );                
-            }
-        //stop fast recovery
-        if( ECCHConnecting != aState && 
-                KErrNone == aError &&
-                0 < iServicesInRecovery.Count() )
-            {
-            CCHLOGSTRING( "CCCHServiceHandler::StateChangedL checking if recovery is still needed" );
-            TInt idx = iServicesInRecovery.Find( TServiceSelection( aServiceId, aType ) );
-            if( KErrNotFound != idx )
-                {
-                CCHLOGSTRING( "CCCHServiceHandler::StateChangedL this service has recovered, recovery still on..." );
-                iServicesInRecovery.Remove( idx );
-                }
-            if( 0 == iServicesInRecovery.Count() )
-                {
-                CCHLOGSTRING( "CCCHServiceHandler::StateChangedL all services recovered, stopping recovery" );
-                CancelConnectionRecoveryTimer();
-                }
-            }
-        
-        if ( ECCHConnecting != aState || 
-            ECCHConnecting == aState && KErrNone != aError )
-            {
-            // reset startup counter
-            TBool startupFlag( EFalse );
-            iServer.SPSHandler().LoadAtStartUpL( aServiceId, aType, startupFlag );
-            if ( startupFlag )
-                {
-                iServer.ResetStartupCounterL();
-                }
-            }
-        }
-    else
-        {
-        User::Leave( index );
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::StateChanged: OUT" );
-        
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::StartConnectionRecoveryTimer
-// -----------------------------------------------------------------------------
-//
-void CCCHServiceHandler::StartConnectionRecoveryTimer( TInt (*aFunction)(TAny* aPtr) )
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler[0x%x]::StartConnectionRecoveryTimer; IN", this );
-    CancelConnectionRecoveryTimer();
-    if( !iConnectionRecoveryTimer->IsActive() )
-        {
-        iConnectionRecoveryTry = 0;
-        iConnectionRecoveryTimer->Start( iRecoveryInterval[ iConnectionRecoveryTry ] , 
-                              0, 
-                              TCallBack( aFunction, this ) );
-        CCHLOGSTRING( "CCCHServiceHandler::StartConnectionRecoveryTimer; recovery timer started");
-        
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::StartConnectionRecoveryTimer; OUT");
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::CancelConnectionRecoveryTimer
-// -----------------------------------------------------------------------------
-//
-void CCCHServiceHandler::CancelConnectionRecoveryTimer()
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler[0x%x]::CancelConnectionRecoveryTimer; IN", this );
-
-    if( iConnectionRecoveryTimer->IsActive() )
-        {
-        iConnectionRecoveryTimer->Cancel();
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::CancelConnectionRecoveryTimer; OUT" );        
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::ConnectionRecoveryEvent
-// -----------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::ConnectionRecoveryEvent( TAny* aSelf )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::ConnectionRecoveryEvent; IN" );
-    CCCHServiceHandler* self = static_cast<CCCHServiceHandler*>( aSelf );
-    self->HandleConnectionRecovery();
-    CCHLOGSTRING( "CCCHServiceHandler::ConnectionRecoveryEvent; OUT" );
-    return 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::HandleConnectionRecovery
-// -----------------------------------------------------------------------------
-//
-void CCCHServiceHandler::HandleConnectionRecovery()
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler[0x%x]::HandleConnectionRecovery IN",
-                   this );
-    iConnectionRecoveryTry++;
-    CCHLOGSTRING2( "CCCHServiceHandler::HandleConnectionRecovery; recovery try:%d",iConnectionRecoveryTry );
-    iServer.ConnMonHandler().ScanNetworks( ETrue );    
-    CancelConnectionRecoveryTimer();
-    
-    if( KConnectionRecoveryMaxTries > iConnectionRecoveryTry )
-        {
-        CCHLOGSTRING( "CCCHServiceHandler::HandleConnectionRecovery; recovery continues" );
-        iConnectionRecoveryTimer->Start( iRecoveryInterval[ iConnectionRecoveryTry ], 
-                              0,
-                              TCallBack( CCCHServiceHandler::ConnectionRecoveryEvent, this ) );
-        }
-    else
-        {
-        CCHLOGSTRING( "CCCHServiceHandler::HandleConnectionRecovery; max tries reached, recovery canceled" );
-        }                   
-    CCHLOGSTRING( "CCCHServiceHandler::HandleConnectionRecovery OUT" );
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::StartPluginUnloadTimer
-// -----------------------------------------------------------------------------
-//
-void CCCHServiceHandler::StartPluginUnloadTimer( )
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler[0x%x]::StartPluginUnloadTimer; IN", this );
-    CancelPluginUnloadTimer();
-    if( !iPluginUnloadTimer->IsActive() )
-        {
-        iPluginUnloadTimer->Start( KCCHPluginUnloadTimeout , 
-                              0, 
-                              TCallBack( CCCHServiceHandler::PluginUnloadEvent, this ) );
-        CCHLOGSTRING( "CCCHServiceHandler::StartPluginUnloadTimer; plugin unload timer started");
-        
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::StartPluginUnloadTimer; OUT");
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::CancelPluginUnloadTimer
-// -----------------------------------------------------------------------------
-//
-void CCCHServiceHandler::CancelPluginUnloadTimer()
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler[0x%x]::CancelPluginUnloadTimer; IN", this );
-
-    if( iPluginUnloadTimer->IsActive() )
-        {
-        iPluginUnloadTimer->Cancel();
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::CancelPluginUnloadTimer; OUT" );        
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::PluginUnloadEvent
-// -----------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::PluginUnloadEvent( TAny* aSelf )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::PluginUnloadEvent; IN" );
-    CCCHServiceHandler* self = static_cast<CCCHServiceHandler*>( aSelf );
-    self->HandlePluginUnload();
-    CCHLOGSTRING( "CCCHServiceHandler::PluginUnloadEvent; OUT" );
-    return 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CCCHServiceHandler::HandlePluginUnload
-// -----------------------------------------------------------------------------
-//
-void CCCHServiceHandler::HandlePluginUnload()
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler[0x%x]::HandlePluginUnload IN",
-                   this );
-    CancelPluginUnloadTimer();
-    TRAP_IGNORE( UnloadDisabledPluginsL( ) );
-    
-    CCHLOGSTRING( "CCCHServiceHandler::HandlePluginUnload OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::Exists
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::Exists( TCCHSubserviceType aType, 
-                                  TCCHSubserviceState aState,
-                                  TInt aError ) const
-    {
-    CCHLOGSTRING3( "CCCHServiceHandler::Exists(%d,%d)",aType,aState );
-    TBool bReturn( EFalse );
-    for( TInt i( 0 ); i < iServices.Count(); i++ )
-        {
-        for ( TInt j( 0 ); j < iServices[ i ]->SubserviceCount(); j++ )
-            {
-            TCCHSubserviceState state = ECCHUninitialized;
-            TInt err = iServices[ i ]->GetStatus(iServices[ i ]->GetSubserviceType( j ), state );
-            if( err == KErrNone )
-                {
-                if( aType == iServices[ i ]->GetSubserviceType( j ) && 
-                    aState == state &&
-                    aError == iServices[ i ]->GetError(iServices[ i ]->GetSubserviceType( j ) ) )
-                    {
-                    bReturn = ETrue;
-                    break;
-                    }
-                }
-            }
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::Exists returns: %d",bReturn );        
-    return bReturn;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::LoadPluginsL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::LoadPluginsL()
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::LoadPluginsL: IN" );
-    
-    // Get plugin uids to array;
-    RArray<TUid> uids;
-    CleanupClosePushL( uids );
-    
-    TUid pluginUid( KNullUid );
-        
-    for( TInt i( 0 ); i < iServices.Count(); i++ )
-        {     
-        for ( TInt j( 0 ); j < iServices[ i ]->SubserviceCount(); j++ )
-            {
-            if ( iServices[ i ]->StartupFlagSet( j ) )
-                {
-                pluginUid = iServices[ i ]->GetUidL( j );
-    
-                if ( KErrNotFound == uids.Find( pluginUid ) && 
-                    KNullUid != pluginUid )
-                    {
-                    uids.Append( pluginUid );
-
-                    TRAP_IGNORE( 
-                        iServer.PluginHandler().LoadPluginsL( pluginUid ) );
-                    
-                    // Set notifier to loaded Plug-ins                        
-                    iServer.PluginHandler().SetServiceNotifier( this );                        
-                    }
-                // Enable subservice
-                TServiceSelection selection;
-                selection.iServiceId = iServices[ i ]->GetServiceId();
-                selection.iType = iServices[ i ]->GetSubserviceType( j );
-                EnableService( selection, EFalse );
-                }           
-            }
-        }        
-    CleanupStack::PopAndDestroy( &uids );    
-    
-    CCHLOGSTRING( "CCCHServiceHandler::LoadPluginsL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::UnloadPlugin
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::UnloadDisabledPluginsL( )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::UnloadDisabledPluginsL: IN" );
-    
-    // Get plugin uids to array;
-    RArray<TUid> uidsToBeUnloaded;
-    RArray<TUid> uidsNotToBeUnloaded;
-    CleanupClosePushL( uidsToBeUnloaded );
-    CleanupClosePushL( uidsNotToBeUnloaded );
-    
-    
-    // ...let's go through services & sub services
-    for ( TInt ixSer=0; ixSer < iServices.Count(); ixSer++ )
-        {
-        for ( TInt ixSub=0; ixSub < iServices[ ixSer ]->SubserviceCount(); ixSub++ )
-            {
-            TUid pluginUid( KNullUid );
-            TInt error( KErrNone );
-            TRAP( error, pluginUid = iServices[ ixSer ]->GetUidL( ixSub ));
-            // if subservice was found
-            if( KErrNone == error )
-                {
-                
-                TCCHSubserviceState state = ECCHUninitialized;
-                
-                // subservice was found, so don't need to check return value
-                iServices[ ixSer ]->GetStatus(
-                     iServices[ ixSer ]->GetSubserviceType( ixSub ), state );
-                     
-                // if non disabled subservice found, add it to non-unload arry                     
-                if( ECCHDisabled != state )
-                    {
-                    uidsNotToBeUnloaded.Append( pluginUid );
-                    }
-                    
-                else
-                    {
-                    if( KErrNotFound == uidsToBeUnloaded.Find( pluginUid ) )
-                        {
-                        // the others go to unload array
-                        uidsToBeUnloaded.Append( pluginUid );        
-                        }
-                    }
-                }
-            }
-        }
-    iServer.PluginHandler().RemoveServiceNotifier( this );
-    for( TInt i=0; i<uidsToBeUnloaded.Count(); i++ )
-        {
-        //unload plugin & set state if not found from non-unloadable array
-        if( KErrNotFound == uidsNotToBeUnloaded.Find( uidsToBeUnloaded[i] ) )
-            {
-            CCHLOGSTRING2(
-                "CCCHServiceHandler::UnloadDisabledPluginsL; unloading plugin UID:0x%x",
-                    uidsToBeUnloaded[i] );
-            iServer.PluginHandler().UnloadPlugin( uidsToBeUnloaded[i] );
-            }
-        }
-    iServer.PluginHandler().SetServiceNotifier( this );
-    CleanupStack::PopAndDestroy( &uidsNotToBeUnloaded );   
-    CleanupStack::PopAndDestroy( &uidsToBeUnloaded );    
-    CCHLOGSTRING( "CCCHServiceHandler::UnloadDisabledPluginsL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::EnableService
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::EnableService( 
-    const TServiceSelection aServiceSelection, 
-    const TBool aConnectivityCheck )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::EnableService: IN" );
-    TInt error( ServiceExist( aServiceSelection ) );
-    TBool connectionOk( EFalse );
-    if ( KErrNotFound != error )
-        {
-        TInt index = error;
-        TRAP( error, connectionOk = IsServiceConnectivityDefinedL( aServiceSelection ) );
-        if( KErrNone == error )
-            {
-            if( connectionOk )
-                {
-                if( iCancelNotify )
-                    {
-                    DisableNotifyChange();
-                    }
-         
-                CCHLOGSTRING3( "CCCHServiceHandler::EnableService: service:%d, type:%d",
-                        aServiceSelection.iServiceId, aServiceSelection.iType );
-    
-                // If client wants to enable VoIP subservice and VoIP are not supported
-                // send KErrNotSupported notify to the client
-                if ( ( ECCHUnknown == aServiceSelection.iType ||
-                       ECCHVoIPSub == aServiceSelection.iType ) &&
-                       iServices[ index ]->SubserviceExist( ECCHVoIPSub ) &&
-                       !iServer.FeatureManager().VoIPSupported() )
-                    {
-                    CCHLOGSTRING( "CCCHServiceHandler::EnableService: No support for VoIP" );
-                    TRAP_IGNORE( iServices[ index ]->SetErrorL( ECCHVoIPSub, KErrNotSupported ) );
-                    TRAP_IGNORE( iServices[ index ]->SetStateL( ECCHVoIPSub, ECCHDisabled ) );
-                    // Enable one by one all subservices except VoIP
-                    if ( ECCHUnknown == aServiceSelection.iType )
-                        {
-                        for ( TInt i( 0 ); i < iServices[ index ]->SubserviceCount(); i++ )
-                            {
-                            if ( ECCHVoIPSub != iServices[ index ]->GetSubserviceType( i ) )
-                                {
-                                TRAP( error, iServices[ index ]->EnableL(
-                                    iServices[ index ]->GetSubserviceType( i ),
-                                        aConnectivityCheck, this ) );
-                                }
-                            }
-                        }
-                    }
-                else
-                    {
-                    TRAP( error, iServices[ index ]->EnableL( 
-                        aServiceSelection.iType, aConnectivityCheck, this ) );
-                    }
-                if( iCancelNotify )
-                    {
-                    EnableNotifyChange();
-                    }
-                if( HasWlanIap( aServiceSelection ) && KErrNone == error )
-                    {
-                    CCHLOGSTRING( "CCCHServiceHandler::EnableService: Launching WLAN scan..." );
-                    TRAP_IGNORE( iWlanExtension->EnableWlanScanL() );
-                    }
-                // There could be new Plug-ins after EnableL, so we must set
-                // notifier to loaded Plug-ins
-                iServer.PluginHandler().SetServiceNotifier( this );
-                }
-            else
-                {
-                error = KCCHErrorAccessPointNotDefined;
-                }
-            CCHLOGSTRING2
-                    ( "CCCHServiceHandler::EnableService: error: %d", error );
-            }
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::EnableService: OUT" );
-    return error;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::DisableService
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::DisableService( 
-    const TServiceSelection aServiceSelection )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::DisableService: IN" );
-    TInt error( ServiceExist( aServiceSelection ) );
-    
-    if ( KErrNotFound != error )
-        {
-        TInt index( error );
-        if( iCancelNotify )
-            {
-            DisableNotifyChange();
-            }
-
-        TRAP( error, iServices[ index ]->DisableL(
-            aServiceSelection.iType ) );
-        
-        DisableWlanScan();
-        if( iCancelNotify )
-            {
-            EnableNotifyChange();            
-            }
-            CCHLOGSTRING2
-                ( "CCCHServiceHandler::DisableService: error: %d", error );
-        }
-    CCHLOGSTRING2(
-        "CCCHServiceHandler::DisableService: return %d OUT", error );
-    return error;
-    }
-    
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::DisableWlanScan
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::DisableWlanScan( )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::DisableWlanScan: IN" );
-    
-    TBool disableWlanScan( ETrue );
-    TCCHSubserviceState serviceState( ECCHUninitialized );
-    TCCHSubserviceType serviceType( ECCHUnknown );
-    TInt serviceId( 0 );
-    
-     // ...let's go through services & sub services
-    for ( TInt ixSer = 0; ixSer < iServices.Count(); ixSer++ )
-        {
-        for ( TInt ixSub = 0; ixSub < iServices[ ixSer ]->SubserviceCount(); ixSub++ )
-            {
-            serviceType = iServices[ ixSer ]->GetSubserviceType( ixSub );
-            TInt err = iServices[ ixSer ]->GetStatus( serviceType, serviceState );
-            if( err == KErrNone )
-                {
-                // if found even one enabled/connecting service, do not deactivate scan
-                if( ECCHEnabled == serviceState || ECCHConnecting == serviceState )
-                    {
-                    serviceId =  iServices[ ixSer ]->GetServiceId();
-                    
-                    TServiceConnectionInfo serviceConnInfo( serviceId, serviceType, 0, 0 );
-                    GetConnectionInfo( serviceConnInfo );
-                    // existing snap overrides iap
-                    if( serviceConnInfo.iSNAPId != 0 )
-                        {
-                        TInt wlanIaps( 0 );
-                        TInt allIaps( 0 );
-                        TInt error( KErrNone );
-                        TRAP( error, 
-                            {
-                            wlanIaps = iCommDbWatcher->GetIapCountFromSnap( serviceConnInfo.iSNAPId, ETrue, ETrue );
-                            allIaps = iCommDbWatcher->GetIapCountFromSnap( serviceConnInfo.iSNAPId, EFalse );
-                            } );
-                        
-                        // in case of possibility -> WLAN ALR we need to keep the scan active
-                        // in case of possibility -> do not disable wlan scan if there is only one iap 
-                        // and the iap is wlan
-                        if( KErrNone == error )
-                            {
-                            if( 1 <= allIaps && 0 < wlanIaps )
-                                {
-                                disableWlanScan = EFalse;
-                                break;
-                                }
-                            }
-                        }
-                    else if( serviceConnInfo.iIapId != 0 )
-                        {
-                        TInt error( KErrNone );
-                        TBool isWlanIap( EFalse );
-                        
-                        TRAP( error, isWlanIap = iCommDbWatcher->IsWlanApL( serviceConnInfo.iIapId ) )
-                        CCHLOGSTRING2( "CCCHServiceHandler::DisableWlanScan: error: %d", error );
-                        
-                        if( KErrNone == error)
-                            {
-                            //in case the iap is wlan type, scan is not deactivated
-                            if( isWlanIap )
-                                {
-                                disableWlanScan = EFalse;
-                                break;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        if( !disableWlanScan )
-            {
-            break;
-            }
-        }            
-    if( disableWlanScan )
-        {
-        CCHLOGSTRING( "CCCHServiceHandler::DisableWlanScan disabling wlan scan..." );
-        
-        TRAP_IGNORE( iWlanExtension->DisableWlanScanL() ) ;
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::DisableWlanScan: OUT" );
-    }
-    
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::SetConnectionInfo
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::SetConnectionInfo( 
-    const TServiceConnectionInfo aServiceConnInfo )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::SetConnectionInfo: IN" );
-    TInt error( KErrNotFound );
-    CCHLOGSTRING2( "CCCHServiceHandler::SetConnectionInfo: serviceId %d",
-        aServiceConnInfo.iServiceSelection.iServiceId );
-    CCHLOGSTRING2( "CCCHServiceHandler::SetConnectionInfo: iType %d",
-        aServiceConnInfo.iServiceSelection.iType );
-    CCHLOGSTRING2( "CCCHServiceHandler::SetConnectionInfo: iSNAPId %d",
-        aServiceConnInfo.iSNAPId );
-    CCHLOGSTRING2( "CCCHServiceHandler::SetConnectionInfo: iIapId %d",
-        aServiceConnInfo.iIapId );
-    CCHLOGSTRING2( "CCCHServiceHandler::SetConnectionInfo: iReserved %d",
-        aServiceConnInfo.iReserved );
-
-    if ( KErrNotFound != 
-        ( error = FindService( aServiceConnInfo.iServiceSelection.iServiceId ) ) )
-        {
-        TInt index( error );
-        TRAP( error, iServices[ index ]->SetConnectionInfoL( 
-            aServiceConnInfo ) );
-        StartPluginUnloadTimer( );
-        CCHLOGSTRING2
-            ( "CCCHServiceHandler::SetConnectionInfo: error: %d", error );
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::SetConnectionInfo: OUT" );
-    return error;
-    }
-    
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::GetConnectionInfo
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::GetConnectionInfo( 
-    TServiceConnectionInfo& aServiceConnInfo )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::GetConnectionInfo: IN" );
-    TInt error( KErrNotFound );
-    
-    if ( KErrNotFound != 
-        ( error = FindService( aServiceConnInfo.ServiceId() ) ) )
-        {
-        TInt index( error );
-        TRAP( error, iServices[ index ]->GetConnectionInfoL( 
-                aServiceConnInfo ) );
-        StartPluginUnloadTimer( );
-        CCHLOGSTRING2
-            ( "CCCHServiceHandler::GetConnectionInfo: error: %d", error );
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::GetConnectionInfo: OUT" );
-    return error;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::UsesWlanIapL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::UsesWlanIap( 
-    const TServiceSelection& aServiceSelection )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::UsesWlanIap: IN" );
-    TBool isWlanIap( EFalse );
-    TServiceConnectionInfo serviceConnInfo(
-            aServiceSelection.iServiceId, aServiceSelection.iType, 0, 0 );
-    CCHLOGSTRING3( "CCCHServiceHandler::UsesWlanIap: service:%d, type:%d",
-            aServiceSelection.iServiceId, aServiceSelection.iType );
-    
-    TInt error = GetConnectionInfo( serviceConnInfo );
-    
-    if( KErrNone == error )
-        {
-        
-        CCHLOGSTRING3( "CCCHServiceHandler::UsesWlanIap: snap:%d, snap:%d",
-                serviceConnInfo.iSNAPId, serviceConnInfo.iIapId );
-        if( 0 != serviceConnInfo.iSNAPId )
-            {
-            CCHLOGSTRING( "CCCHServiceHandler::UsesWlanIapL: SNAP in use" );
-            TInt count( 0 );
-            TRAP( error, count = iCommDbWatcher->GetIapCountFromSnap( serviceConnInfo.iSNAPId, ETrue ));
-            if( KErrNone == error && 0 < count )
-                {
-                isWlanIap = ETrue;
-                }
-            }
-        else if( 0 != serviceConnInfo.iIapId )
-            {
-            CCHLOGSTRING( "CCCHServiceHandler::UsesWlanIapL: IAP in use" );
-           
-            TRAP( error, isWlanIap = iCommDbWatcher->IsWlanApL( serviceConnInfo.iIapId ) );
-            CCHLOGSTRING2( "CCCHServiceHandler::UsesWlanIap: error: %d", error );
-            }
-
-
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::UsesWlanIap: OUT, value=%d", isWlanIap );
-    return isWlanIap;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::IsConnectionDefined
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::IsConnectionDefinedL( 
-    const TServiceSelection& aServiceSelection ) 
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::IsConnectionDefined: IN" );
-    TBool isOk( EFalse );
-    __ASSERT_DEBUG( aServiceSelection.iType != ECCHUnknown, User::Panic( KNullDesC, KErrGeneral ) );
-    TServiceConnectionInfo serviceConnInfo(
-            aServiceSelection.iServiceId, aServiceSelection.iType, 0, 0 );
-    CCHLOGSTRING3( "CCCHServiceHandler::IsConnectionDefined: service:%d, type:%d",
-            aServiceSelection.iServiceId, aServiceSelection.iType );
-    
-    TInt error = GetConnectionInfo( serviceConnInfo );
-    User::LeaveIfError( error );
-    
-    CCHLOGSTRING3( "CCCHServiceHandler::IsConnectionDefined: snap:%d, snap:%d",
-            serviceConnInfo.iSNAPId, serviceConnInfo.iIapId );
-    if( 0 != serviceConnInfo.iSNAPId )
-        {
-        TInt count( 0 );
-        count = iCommDbWatcher->GetIapCountFromSnap( serviceConnInfo.iSNAPId, EFalse, ETrue );
-        CCHLOGSTRING( "CCCHServiceHandler::IsConnectionDefined: SNAP in use" );
-        if( KErrNone == error && 0 < count )
-            {
-            isOk = ETrue;
-            }
-        }
-    else if( 0 != serviceConnInfo.iIapId )
-        {
-        CCHLOGSTRING( "CCCHServiceHandler::IsConnectionDefined: IAP in use" );
-        isOk = ETrue;
-        }
-
-    CCHLOGSTRING2( "CCCHServiceHandler::IsConnectionDefined: OUT, value=%d", isOk );
-    return isOk;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::IsServiceConnectivityDefined
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::IsServiceConnectivityDefinedL( 
-    const TServiceSelection& aServiceSelection ) 
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::IsServiceConnectivityDefined: IN" );
-    
-    TBool isOk( EFalse );
-    TInt error( KErrNone );
-    TInt index = FindService( aServiceSelection.iServiceId );
-    if ( KErrNotFound != index )
-        {
-        if( ECCHUnknown == aServiceSelection.iType )
-            {
-            for( TInt i = 0; i < iServices[ index ]->SubserviceCount(); i++ )
-                {
-                TRAP( error, isOk = IsConnectionDefinedL( 
-                        TServiceSelection( aServiceSelection.iServiceId, 
-                        iServices[ index ]->GetSubserviceType( i ) ) ) ) ;
-                if( isOk )
-                    {
-                    error = KErrNone;
-                    break;
-                    }
-                }
-            }
-        else
-            {
-            TRAP( error, isOk = IsConnectionDefinedL( aServiceSelection ) );
-            }    
-        }
-    CCHLOGSTRING3( 
-        "CCCHServiceHandler::IsServiceConnectivityDefined: OUT, value=%d, error=%d", isOk, error );
-    User::LeaveIfError( error );
-    return isOk;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::HasWlanIap
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CCCHServiceHandler::HasWlanIap( 
-    const TServiceSelection& aServiceSelection )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::HasWlanIap: IN" );
-    
-    TBool isWlanIap( EFalse );
-    TInt index = FindService( aServiceSelection.iServiceId );
-    if ( KErrNotFound != index )
-        {
-        if( ECCHUnknown == aServiceSelection.iType )
-            {
-            for( TInt i = 0; i < iServices[ index ]->SubserviceCount(); i++ )
-                {
-                isWlanIap = UsesWlanIap( 
-                        TServiceSelection( aServiceSelection.iServiceId, 
-                        iServices[ index ]->GetSubserviceType( i ) ) ) ;
-                if( isWlanIap )
-                    {
-                    break;
-                    }
-                }
-            }
-        else
-            {
-            isWlanIap = UsesWlanIap( aServiceSelection );
-            }    
-        StartPluginUnloadTimer( );
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::HasWlanIap: OUT, value=%d", isWlanIap );
-    return isWlanIap;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::ServiceCountL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::ServiceCountL( RMessage2 aMessage ) const
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::ServiceCountL: IN" );
-    
-    TPckgBuf<TUint32> pckgServiceCount;
-    aMessage.ReadL( 0, pckgServiceCount );
-    TCCHSubserviceType type( 
-        static_cast<TCCHSubserviceType>( aMessage.Int1() ) );
-    
-    if ( ECCHUnknown == type )
-        {
-        // Count of services
-        pckgServiceCount() = iServer.SPSHandler().GetServicesCountL();
-        // Service count back to the client
-        aMessage.WriteL( 0, pckgServiceCount );
-        }
-    else
-        {
-        // Count of services which contains subservices
-        pckgServiceCount() = ServiceCount( type );
-        // Service count back to the client
-        aMessage.WriteL( 0, pckgServiceCount );
-        }        
-    
-    CCHLOGSTRING( "CCCHServiceHandler::ServiceCountL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::GetServicesL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::GetServicesL( RMessage2 aMessage ) const
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::GetServicesL: IN" );
-    TInt count =  iServices.Count();
-    TInt index( KErrNotFound );
-    if ( count )
-        {
-        TUint32 serviceId = aMessage.Int0();
-        TCCHSubserviceType type ( ECCHUnknown );
-        type = static_cast<TCCHSubserviceType>( aMessage.Int1() );
-        
-        if ( KErrNotFound == aMessage.Int0() )
-            {
-            serviceId = KErrNone;
-            }
-        else if ( serviceId != KErrNone )
-            {
-            count = 1;
-            }
-                    
-        CArrayFixFlat<TCCHService>* serviceArray = 
-            new( ELeave )CArrayFixFlat<TCCHService>( count );
-        CleanupStack::PushL( serviceArray );
-        
-        TCCHService service;
-        // Get all services
-        if ( KErrNone == serviceId )
-            {
-            if ( type == ECCHUnknown )
-                {
-                for ( TInt i( 0 ); i < count; i++ )
-                    {
-                    iServices[ i ]->FillServiceInfo( service );
-                    serviceArray->AppendL( service );
-                    }    
-                }
-            else
-                {
-                for ( TInt i( 0 ); i < count; i++ )
-                    {
-                    if ( iServices[ i ]->SubserviceExist( type ) )
-                        {
-                        iServices[ i ]->FillServiceInfo( service );
-                        serviceArray->AppendL( service );
-                        }                    
-                    }
-                }
-            }
-        // Get specified service
-        else 
-            {
-            if ( type == ECCHUnknown )
-                {
-                index = FindService( serviceId );
-                if ( KErrNotFound != index )
-                    {
-                    iServices[ index ]->FillServiceInfo( service );
-                    serviceArray->AppendL( service );
-                    }
-                }
-            else
-                {
-                TServiceSelection selection( serviceId, type ); 
-                index = ServiceExist( selection );
-                if ( KErrNotFound != index )
-                    {
-                    iServices[ index ]->FillServiceInfo( service );
-                    serviceArray->AppendL( service );
-                    }
-                }
-            }
-        
-        TUint32 length = serviceArray->Count() * sizeof( TCCHService );
-        
-        if ( length )
-            {
-            TPtrC8 servicePtr;
-            servicePtr.Set( 
-                reinterpret_cast<TText8*>( &( *serviceArray )[ 0 ] ), 
-                    length );
-            aMessage.WriteL( 2, servicePtr );                     
-            }
-        else
-            {
-            User::Leave( KErrNotFound );
-            }            
-            
-        CleanupStack::PopAndDestroy( serviceArray );
-        }
-    else
-        {
-        User::Leave( KErrNotFound );
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::GetServicesL: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::GetServiceState
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-TInt CCCHServiceHandler::GetServiceState( const RMessage2 aMessage )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::GetServiceStateL: IN" );
-        
-    TUint32 serviceId( 0 );
-    TCCHSubserviceType type ( ECCHUnknown );
-    TPckgBuf<TCCHSubserviceState> status;
-    serviceId = aMessage.Int0();
-    type = static_cast<TCCHSubserviceType>( aMessage.Int1() );
-    
-    TInt error( FindService( serviceId ) );
-    TInt errorState = KErrNone;
-    
-    if ( KErrNotFound != error )
-        {
-        TInt index( error );
-        TRAP( error, 
-            {
-            aMessage.ReadL( 2, status );
-            errorState = iServices[ index ]->GetStatus( type, status() );
-            if( errorState == KErrNone )
-                {
-                aMessage.WriteL( 2, status );
-                }
-            } );
-        if( KErrNone == error )
-            {
-            if( errorState == KErrNone )
-                {
-                error = iServices[ index ]->GetError( type );
-                }
-            else
-                {
-                error = errorState;
-                }
-            }
-        StartPluginUnloadTimer( );
-        }
-    
-    CCHLOGSTRING2( 
-        "CCCHServiceHandler::GetServiceStateL: return %d OUT", error );
-    return error;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::GetServiceState
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-TCCHSubserviceState CCCHServiceHandler::ServiceState(
-        const TUint aServiceId )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::ServiceState: IN" );
-    
-    TCCHSubserviceState state( ECCHUninitialized );
-    TInt error( FindService( aServiceId ) );
-    
-    if ( KErrNotFound != error )
-        {
-        state = iServices[ error ]->GetState();
-        }
-    
-    CCHLOGSTRING2( 
-        "CCCHServiceHandler::ServiceState: return %d OUT", state );
-    return state;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::GetServiceInfo
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-TInt CCCHServiceHandler::GetServiceInfo( const RMessage2 aMessage )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::GetServiceInfo: IN" );
-    TBuf<KCCHMaxProtocolNameLength> buffer;
-
-    TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
-
-    TInt error = KErrNone;
-    TRAP( error, 
-        { 
-        aMessage.ReadL( 0, serviceConnInfoPckg );
-        } );
-        
-    if( error ) 
-        {
-        return error;
-        }
-   
-    TServiceConnectionInfo conninfo;
-     
-    conninfo.iServiceSelection.iServiceId = serviceConnInfoPckg().iServiceSelection.iServiceId;
-    conninfo.iServiceSelection.iType      = serviceConnInfoPckg().iServiceSelection.iType;
-    conninfo.iServiceSelection.iParameter = serviceConnInfoPckg().iServiceSelection.iParameter;
-  
-    error = ServiceExist( conninfo.iServiceSelection );
-    
-    if ( KErrNotFound != error )
-        {
-        TInt index( error );
-
-        if( conninfo.iServiceSelection.iParameter == ECchServiceInfo )
-            {
-            TRAP( error, 
-                {
-                iServices[ index ]->GetServiceInfoL( 
-                    buffer, conninfo.iServiceSelection.iType );
-                aMessage.WriteL( 1, buffer );
-                } );
-            }
-        StartPluginUnloadTimer( );
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::GetServiceInfo: return %d OUT", error );
-    return error;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::ReserveService
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-TInt CCCHServiceHandler::ReserveService( const RMessage2 aMessage ) 
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::ReserveService: IN" );
-    
-    TServiceSelection serviceSelection(aMessage.Int0(), 
-        static_cast<TCCHSubserviceType>( aMessage.Int1() ) );
-    
-    TInt error( ServiceExist( serviceSelection ) );
-    
-    if ( KErrNotFound != error )
-        {
-        TInt index( error );
-        TRAP( error, 
-            {
-            iServices[ index ]->ReserveServiceL( 
-                serviceSelection.iType );
-            } );
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::ReserveService: return %d OUT", error );
-    return error;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::FreeService
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//    
-TInt CCCHServiceHandler::FreeService( const RMessage2& aMessage )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::FreeService: IN" );
-    
-    TServiceSelection serviceSelection(aMessage.Int0(), 
-        static_cast<TCCHSubserviceType>( aMessage.Int1() ) );
-    
-    TInt error( ServiceExist( serviceSelection ) );
-    
-    if ( KErrNotFound != error )
-        {
-        TInt index( error );
-        TRAP( error, 
-            {
-            iServices[ index ]->FreeServiceL( 
-                serviceSelection.iType );
-            } );
-        }
-    CCHLOGSTRING2( "CCCHServiceHandler::FreeService: return %d OUT", error );        
-    return error;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::IsReserved
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::IsReserved( RMessage2 aMessage ) const
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::IsReserved: IN" );
-    
-    
-    TServiceSelection serviceSelection(aMessage.Int0(),
-        static_cast<TCCHSubserviceType>( aMessage.Int1() ) );
-    TInt error( KErrNone );
-            
-    TPckgBuf<TBool> pckgIsReserved;
-    TRAP( error, aMessage.ReadL( 2, pckgIsReserved ) );
-    
-    error = ServiceExist( serviceSelection );
-    
-    if ( KErrNotFound != error )
-        {
-        TInt index( error );
-        TRAP( error, 
-            {
-            pckgIsReserved() = iServices[ index ]->IsReservedL( 
-                serviceSelection.iType );
-            } );
-        }
-        
-    
-    if ( KErrNotFound != error )
-        {
-        // Service's reference count back to the client
-        TRAP( error, aMessage.WriteL( 2, pckgIsReserved ) );
-        }
-     
-    
-    CCHLOGSTRING( "CCCHServiceHandler::IsReserved: OUT" );
-    }
-    
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::ServiceExist
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::ServiceExist( TServiceSelection aSelection ) const
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::ServiceExist: IN" );
-    TBool exist( EFalse );
-    TInt index( FindService( aSelection.iServiceId ) );
-    
-    if ( KErrNotFound != index )
-        {
-        exist = iServices[ index ]->SubserviceExist( aSelection.iType );
-        }    
-    CCHLOGSTRING( "CCCHServiceHandler::ServiceExist: OUT" );
-    return !exist ? KErrNotFound : index;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::FindService
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::FindService( TUint32 aServiceId ) const
-    {
-    TBool exist( EFalse );
-    TInt index( KErrNotFound );
-    CCHLOGSTRING2( "CCCHServiceHandler::FindService: serviceId %d",
-        aServiceId );
-    for ( TInt i( 0 ); i < iServices.Count() && !exist; i++ )
-        {
-        exist = iServices[ i ]->GetServiceId() == aServiceId;
-        index = i;
-        }
-    return !exist ? KErrNotFound : index;
-    }
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::HandleNotifyChange
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::HandleNotifyChange( TServiceId aServiceId )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::HandleNotifyChange: IN" );
-    TServiceSelection selection;
-    selection.iServiceId = aServiceId;
-    TInt index( ServiceExist( selection ) );
-    TRAPD( err, 
-        {
-        if ( KErrNotFound != index )
-            {
-            iServices[ index ]->UpdateL( ETrue );
-            }
-        else
-            {
-            TCCHService service;
-            iServer.SPSHandler().GetServiceInfoL( aServiceId, service );
-            AddServiceL( service );
-            } 
-        } );
-    
-    //Check if service is already marked as enabled, and enable it
-    if ( KErrNone == err )
-        {
-        index = ServiceExist( selection );
-        if ( KErrNotFound != index )
-            {
-            CCHLOGSTRING( "CCCHServiceHandler::HandleNotifyChange: service found" );
-            if( iServices[ index ]->StartupFlagSet() && 
-                ECCHEnabled != iServices[ index ]->GetState() )
-                {
-                CCHLOGSTRING( "CCCHServiceHandler::HandleNotifyChange: enabling..." );
-                iCancelNotify = EFalse;
-                EnableService( selection, EFalse );
-                iCancelNotify = ETrue;
-                }
-            }
-        }
-    
-    // If service has removed, err must be other than none 
-    // and we have to update all services
-    if ( KErrNone != err )
-        {
-        TRAP_IGNORE( UpdateL( ETrue ) );
-        }
-    CCHLOGSTRING( "CCCHServiceHandler::HandleNotifyChange: OUT" );
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::EnableNotifyChange
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::EnableNotifyChange()
-    {
-    TRACE_ENTRY_POINT;
-    // Subscribe to service change notifies    
-    TRAP_IGNORE( iNotifier->NotifyChangeL( iServiceIds ) );
-    TRACE_EXIT_POINT;
-    }
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::DisableNotifyChange
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::DisableNotifyChange()
-    {
-    TRACE_ENTRY_POINT;
-    iNotifier->Cancel();
-    TRACE_EXIT_POINT;
-    }
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::ServiceCount
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::ServiceCount( const TCCHSubserviceType aType ) const
-    {
-    CCHLOGSTRING2( "CCCHServiceHandler::ServiceCount: type: %d",aType );
-    
-    TInt count( 0 );
-    
-    for ( TInt i( 0 ); i < iServices.Count(); i++ )
-        {
-        if ( KErrNotFound != iServices[ i ]->FindSubservice( aType ) )
-            {
-            count++;    
-            }
-        }
-    
-    CCHLOGSTRING2( "CCCHServiceHandler::ServiceCount: count: %d", count );
-    
-    return count;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::HandleError
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::HandleError( TInt /*aError*/ )
-    {
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::HandleWLANIapAdded
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::HandleWLANIapAdded( TInt aSNAPId )
-    {
-    CCHLOGSTRING( "CCCHServiceHandler::HandleWLANIapAdded: IN" );
-    TBool startScan( EFalse );
-    TCCHSubserviceState serviceState( ECCHUninitialized );
-    TCCHSubserviceType serviceType( ECCHUnknown );
-        
-    // go through all services & subservices
-    for( TInt i = 0; i < iServices.Count(); i++ )
-        {
-        for ( TInt j = 0; j < iServices[ i ]->SubserviceCount(); j++ )
-            {
-            serviceType = iServices[ i ]->GetSubserviceType( j );
-            TInt error = iServices[ i ]->GetStatus( serviceType, serviceState );
-            
-            if( KErrNone == error )
-                {
-                // if we have a connecting or enabled service 
-                if( !iServer.FeatureManager().OfflineMode() &&
-                    ( ECCHConnecting == serviceState || ECCHEnabled == serviceState ) )
-                    {
-                    TUint serviceId = iServices[ i ]->GetServiceId();
-                    TServiceConnectionInfo serviceConnInfo( serviceId, serviceType, 0, 0 );
-                    GetConnectionInfo( serviceConnInfo );
-                    
-                    // with a snap with new wlan iap, we start wlan scan
-                    if( aSNAPId == serviceConnInfo.iSNAPId && 0 != aSNAPId )
-                        {
-                        startScan = ETrue;                    
-                        }
-                    }
-                }
-            }
-        }
-    if( startScan )        
-        {
-        CCHLOGSTRING( "CCCHServiceHandler::HandleWLANIapAdded; starting wlan scan" );
-        TRAP_IGNORE( iWlanExtension->ForceEnableWlanScanL() );
-        iServer.ConnMonHandler().ScanNetworks( ETrue );
-        }
-	CCHLOGSTRING( "CCCHServiceHandler::HandleWLANIapAdded: OUT" );
-	}
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::GetSubserviceTypesL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::GetSubserviceTypesL( 
-    const TUint aServiceId, 
-    RArray<TCCHSubserviceType>& aSubserviceTypes ) const
-    {
-    TInt index( FindService( aServiceId ) );
-    if ( KErrNotFound != index )
-        {
-        aSubserviceTypes.Reset();
-        for ( TInt i( 0 ); i < iServices[ index ]->SubserviceCount(); i++ )
-            {
-            CCHLOGSTRING2( "    Service contains subservice: %d", 
-                iServices[ index ]->GetSubserviceType( i ) );
-            
-            aSubserviceTypes.Append( 
-                    iServices[ index ]->GetSubserviceType( i ) );
-            }
-        }
-    else
-        {
-        User::Leave( KErrNotFound );
-        }
-    }
-    
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::SetStartupFlag
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CCCHServiceHandler::SetStartupFlag(
-    TServiceSelection aSelection,
-    TBool aLoadAtStartUp ) const
-    {
-    TInt exist( FindService( aSelection.iServiceId ) );
-    if ( KErrNotFound != exist )
-        {
-        exist = iServices[ exist ]->SetStartupFlag( 
-            aSelection.iType, aLoadAtStartUp ); 
-        }
-    return exist;
-    }
-
-// ---------------------------------------------------------------------------
-// CCCHServiceHandler::HandleRestartL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CCCHServiceHandler::HandleRestartL()
-    {
-    // In restart situation all services and subservices goes to 
-    // disabled state, after restart we will make reregistration 
-    CCHLOGSTRING( "CCHServiceHandler::HandleRestartL() IN" );
-    for ( TInt i( 0 ); i < iServices.Count(); i++ )
-        {
-        for ( TInt j( 0 ); j < iServices[ i ]->SubserviceCount(); j++ )
-            {
-            iServices[ i ]->GetSubserviceL( 
-                iServices[ i ]->GetSubserviceType( j ) ).SetError( KErrCancel );
-            iServices[ i ]->GetSubserviceL( 
-                iServices[ i ]->GetSubserviceType( j ) ).SetState( ECCHDisabled );
-            iServices[ i ]->GetSubserviceL( 
-                iServices[ i ]->GetSubserviceType( j ) ).StatusChanged();
-            }
-        }
-    CCHLOGSTRING( "CCHServiceHandler::HandleRestartL() OUT" );
-    }
-
-// ========================== OTHER EXPORTED FUNCTIONS =======================
-
-//  End of File