convergedconnectionhandler/cchserver/src/cchserviceinfo.cpp
changeset 0 a4daefaec16c
child 12 876a3df1f464
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchserver/src/cchserviceinfo.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,970 @@
+/*
+* Copyright (c) 2007 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:  CCCHServiceInfo implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include "cchserviceinfo.h"
+#include "cchsubserviceinfo.h"
+#include "cchserverbase.h"
+#include "cchpluginhandler.h"
+#include "cchrequeststorage.h"
+#include "cchspshandler.h"
+#include "cchservicehandler.h"
+#include "cchlogger.h"
+#include "cchpluginhandler.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// =========================== LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::CCCHServiceInfo
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CCCHServiceInfo::CCCHServiceInfo( CCCHServerBase& aServer ):
+    iServer( aServer ), 
+    iReserved( ETrue )
+    {
+    // No implementation required
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCCHServiceInfo* CCCHServiceInfo::NewL( CCCHServerBase& aServer )
+    {
+    CCCHServiceInfo* self = CCCHServiceInfo::NewLC( aServer );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCCHServiceInfo* CCCHServiceInfo::NewLC( CCCHServerBase& aServer )
+    {
+    CCCHServiceInfo* self = new (ELeave) CCCHServiceInfo( aServer );
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+// Destructor
+CCCHServiceInfo::~CCCHServiceInfo()
+    {
+    iSubservices.ResetAndDestroy();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetServiceId
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TUint32 CCCHServiceInfo::GetServiceId() const
+    {
+    return iServiceId;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetServiceId
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::SetServiceId( TUint32 aServiceId )
+    {
+    iServiceId = aServiceId;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetName
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+const TDesC CCCHServiceInfo::GetName() const
+    {
+    return iServiceName;
+    }
+    
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetName
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::SetName( const TDesC& aName )
+    {
+    iServiceName.Copy( aName );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::EnableL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::EnableL( 
+    const TCCHSubserviceType aServiceType, 
+    const TBool aConnectivityCheck,
+    MCCHServiceNotifier* aNotifier )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::EnableL: IN" );
+    CCHLOGSTRING2( "CCCHServiceInfo::EnableL: ServiceId = %d", iServiceId );
+    CCHLOGSTRING2( "CCCHServiceInfo::EnableL: iType %d", aServiceType );
+    CCHLOGSTRING2( "CCCHServiceInfo::EnableL: connectivitycheck %d", 
+        aConnectivityCheck );
+    
+    RArray<TUid> uids;
+    CleanupClosePushL( uids );
+        
+    TUid pluginUid( KNullUid );
+    TBool found( EFalse );
+    TUint iapId( 0 );
+        
+    for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+        {
+        pluginUid = iSubservices[ i ]->GetPluginUid();
+            
+        found = ( KErrNotFound != uids.Find( pluginUid ) );
+           
+        if ( !found && pluginUid != KNullUid && 
+            ( ECCHUnknown == aServiceType ||
+              aServiceType == iSubservices[ i ]->Type() ) )
+            {
+            uids.Append( pluginUid );
+            }
+        }
+    
+    0 < uids.Count() ? iServer.PluginHandler().EnableServiceL( 
+        iServiceId, uids, aServiceType, aNotifier, iapId, aConnectivityCheck ) : 
+            User::Leave( KErrNotFound );
+    
+    CleanupStack::PopAndDestroy( &uids );
+    
+    // Update service table
+    if ( ECCHUnknown != aServiceType )
+        {        
+        iServer.SPSHandler().SetLoadAtStartUpL( iServiceId,
+            aServiceType, ETrue );
+        }
+    else
+        {
+        for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+            {
+            iServer.SPSHandler().SetLoadAtStartUpL( iServiceId,
+            iSubservices[ i ]->Type(), ETrue );
+            }
+        }        
+    CCHLOGSTRING( "CCCHServiceInfo::EnableL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::DisableL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::DisableL( const TCCHSubserviceType aServiceType )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::DisableL: IN" );
+    CCHLOGSTRING2( "CCCHServiceInfo::DisableL: ServiceId = %d", iServiceId );
+    CCHLOGSTRING2( "CCCHServiceInfo::DisableL: iType %d", aServiceType );
+    
+    RArray<TUid> uids;
+    CleanupClosePushL( uids );
+        
+    TUid pluginUid( KNullUid );
+    TBool found( EFalse );
+        
+    for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+        {
+        pluginUid = iSubservices[ i ]->GetPluginUid();
+            
+        found = ( KErrNotFound != uids.Find( pluginUid ) );
+                       
+        if ( !found && pluginUid != KNullUid && 
+            ( ECCHUnknown == aServiceType ||
+              aServiceType == iSubservices[ i ]->Type() ) )
+            {
+            uids.Append( pluginUid );
+            }
+        }
+    
+    0 < uids.Count() ? iServer.PluginHandler().DisableServiceL( 
+        iServiceId, uids, aServiceType ) : User::Leave( KErrNotFound );
+        
+    CleanupStack::PopAndDestroy( &uids );
+    
+    // Update service table
+    if ( ECCHUnknown != aServiceType )
+        {        
+        iServer.SPSHandler().SetLoadAtStartUpL( iServiceId,
+            aServiceType, EFalse );
+        }
+    else
+        {
+        for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+            {
+            iServer.SPSHandler().SetLoadAtStartUpL( iServiceId,
+            iSubservices[ i ]->Type(), EFalse );
+            }
+        }
+                
+    CCHLOGSTRING( "CCCHServiceInfo::DisableL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetConnectionInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::SetConnectionInfoL( 
+    const TServiceConnectionInfo aServiceConnInfo )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::SetConnectionInfoL: IN" );
+    
+    RArray<TUid> uids;
+    CleanupClosePushL( uids );
+        
+    TUid pluginUid( KNullUid );
+    TBool found( EFalse );
+        
+    for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+        {        
+        pluginUid = iSubservices[ i ]->GetPluginUid();
+            
+        found = ( KErrNotFound != uids.Find( pluginUid ) );
+        
+        if ( !found && pluginUid != KNullUid && 
+            ( ECCHUnknown == aServiceConnInfo.iServiceSelection.iType ||
+              aServiceConnInfo.iServiceSelection.iType == 
+              iSubservices[ i ]->Type() ) )
+            {
+            uids.Append( pluginUid );
+            }
+        // Set connection information to subservice
+        if ( ECCHUnknown == aServiceConnInfo.iServiceSelection.iType ||
+              aServiceConnInfo.iServiceSelection.iType == 
+              iSubservices[ i ]->Type() ) 
+            {
+            iSubservices[ i ]->SetIapId( aServiceConnInfo.iIapId );
+            iSubservices[ i ]->SetSNAPId( aServiceConnInfo.iSNAPId );
+            }
+        }
+    
+    if ( 0 == uids.Count() )
+        {
+        User::Leave( KErrNotFound );
+        }
+                
+    if ( !aServiceConnInfo.iIapId && aServiceConnInfo.iSNAPId )
+        {
+        iServer.PluginHandler().SetSnapIdL( 
+            aServiceConnInfo.ServiceId(), uids, 
+                aServiceConnInfo.Type(), 
+                aServiceConnInfo.iSNAPId );
+        }
+    else if ( aServiceConnInfo.iIapId && !aServiceConnInfo.iSNAPId )
+        {
+        iServer.PluginHandler().SetIapIdL( 
+            aServiceConnInfo.ServiceId(), uids, 
+                aServiceConnInfo.Type(), 
+                aServiceConnInfo.iIapId );
+        }
+    else if ( aServiceConnInfo.iIapId && aServiceConnInfo.iSNAPId )
+        {
+        iServer.PluginHandler().SetIapIdL( 
+            aServiceConnInfo.ServiceId(), uids, 
+                aServiceConnInfo.Type(),
+                aServiceConnInfo.iIapId );
+        iServer.PluginHandler().SetSnapIdL( 
+            aServiceConnInfo.ServiceId(), uids, 
+            aServiceConnInfo.Type(),
+                aServiceConnInfo.iSNAPId );
+        }
+   
+    // username must not be empty. And check this field should be set 
+    if ( aServiceConnInfo.iServiceSelection.iParameter == ECchUsername && 
+         aServiceConnInfo.iUsername.Length() )
+        {
+        iServer.PluginHandler().SetUsernameL( 
+            aServiceConnInfo.ServiceId(), uids, 
+                aServiceConnInfo.Type(), 
+                aServiceConnInfo.iUsername );
+        }
+
+    // empty password is ok. And check this field should be set
+    if ( aServiceConnInfo.iServiceSelection.iParameter == ECchPassword )
+        {
+        iServer.PluginHandler().SetPasswordL( 
+            aServiceConnInfo.ServiceId(), uids, 
+                aServiceConnInfo.Type(), 
+                aServiceConnInfo.iPassword );
+        }
+    
+    if ( aServiceConnInfo.iServiceSelection.iParameter == ECchReserved )
+        {
+        iReserved = aServiceConnInfo.iReserved;
+        CCHLOGSTRING2( "CCCHServiceInfo::SetConnectionInfoL: reserved no action=%d", iReserved );
+        }
+
+    CleanupStack::PopAndDestroy( &uids );
+    
+    CCHLOGSTRING( "CCCHServiceInfo::SetConnectionInfoL: OUT" );
+    }
+    
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetConnectionInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::GetConnectionInfoL( 
+        TServiceConnectionInfo& aServiceConnInfo ) const
+        {
+        CCHLOGSTRING( "CCCHServiceInfo::GetConnectionInfoL: IN" );
+               
+        TUid pluginUid( KNullUid );
+        TInt index( KErrNone );
+               
+        if ( aServiceConnInfo.iServiceSelection.iType != ECCHUnknown )
+            {
+            index = FindSubservice( aServiceConnInfo.iServiceSelection.iType );
+            }
+
+               
+        if ( KErrNotFound != index && iSubservices.Count() )
+            {
+                   
+            pluginUid = iSubservices[ index ]->GetPluginUid();
+
+            if( aServiceConnInfo.iServiceSelection.iParameter == ECchUsername )
+                {
+                const CCCHPluginHandler& ch = iServer.PluginHandler();
+                const TServiceConnectionInfo& css = aServiceConnInfo;
+
+                RBuf buffer; 
+                buffer.CreateL(KCCHMaxProtocolNameLength);
+                iServer.PluginHandler().GetConnectionParameter( 
+                        pluginUid,
+                        css.iServiceSelection, 
+                        buffer );
+
+                aServiceConnInfo.iUsername = buffer;
+                buffer.Close();
+                }
+            else if( aServiceConnInfo.iServiceSelection.iParameter == 
+                                                        ECchReserved )
+                {
+                CCHLOGSTRING2( "CCCHServiceInfo::GetConnectionInfoL: reserved no action=%d", iReserved );
+                aServiceConnInfo.iReserved = iReserved;
+                }
+            else
+                {
+                User::LeaveIfError( iServer.PluginHandler().GetServiceNetworkInfo( 
+                    aServiceConnInfo.ServiceId(), pluginUid, aServiceConnInfo.Type(), 
+                        aServiceConnInfo.iSNAPId, aServiceConnInfo.iIapId, 
+                        aServiceConnInfo.iSNAPLocked, aServiceConnInfo.iPasswordSet ) );                }
+            }
+        else
+            {
+            User::Leave( KErrNotFound );
+            }
+            
+        CCHLOGSTRING( "CCCHServiceInfo::GetConnectionInfoL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::ReserveServiceL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::ReserveServiceL( 
+    const TCCHSubserviceType aServiceType ) 
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::ReserveServiceL: IN" );
+    
+    TUid pluginUid( KNullUid );
+    TInt index( FindSubservice( aServiceType ) );
+    if ( KErrNotFound != index )
+        {
+        pluginUid = iSubservices[ index ]->GetPluginUid();
+        User::LeaveIfError( iServer.PluginHandler().ReserveService( 
+            iServiceId, pluginUid, aServiceType ));
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+        
+    CCHLOGSTRING( "CCCHServiceInfo::ReserveServiceL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::FreeServiceL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::FreeServiceL( 
+    const TCCHSubserviceType aServiceType )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::FreeServiceL: IN" );
+    
+    TUid pluginUid( KNullUid );
+    TInt index( FindSubservice( aServiceType ) );
+    if ( KErrNotFound != index )
+        {
+        pluginUid = iSubservices[ index ]->GetPluginUid();
+        User::LeaveIfError( iServer.PluginHandler().FreeService( 
+            iServiceId, pluginUid, aServiceType ));
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+        
+    CCHLOGSTRING( "CCCHServiceInfo::FreeServiceL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::IsReservedL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CCCHServiceInfo::IsReservedL( 
+    const TCCHSubserviceType aServiceType ) const
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::IsReservedL: IN" );
+    
+    TBool ret(EFalse);
+    TUid pluginUid( KNullUid );
+    TInt index( FindSubservice( aServiceType ) );
+    if ( KErrNotFound != index )
+        {
+        pluginUid = iSubservices[ index ]->GetPluginUid();
+        User::LeaveIfError( ret = iServer.PluginHandler().IsReserved( 
+            iServiceId, pluginUid, aServiceType ));
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+        
+    CCHLOGSTRING( "CCCHServiceInfo::IsReservedL: OUT" );
+    return ret;
+    }         
+                             
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::IsEnabled
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CCCHServiceInfo::IsEnabled() const
+    {
+    return iIsEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::AddSubservice
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::AddSubserviceL( TCCHSubservice& aSubservice )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::AddSubserviceL: IN" );
+    
+    CCCHSubserviceInfo* subserviceInfo = NULL;
+    if ( ECCHUnknown != aSubservice.iConnectionInfo.iServiceSelection.iType )
+        {
+        // Create new instance and set service id
+        subserviceInfo = 
+            CCCHSubserviceInfo::NewL( aSubservice.iConnectionInfo.iServiceSelection.iServiceId, iServer );
+        // Set subserviceID
+        subserviceInfo->SetSubserviceId( aSubservice.iSubserviceId );
+        
+        // Get plugin uid from service table
+        TUid pUid( KNullUid );
+        
+        iServer.SPSHandler().GetConnectivityPluginUidL( 
+                aSubservice.iConnectionInfo.iServiceSelection.iServiceId, aSubservice.iConnectionInfo.iServiceSelection.iType, pUid ); 
+        subserviceInfo->SetPluginUid( pUid ); 
+          
+        subserviceInfo->SetState( aSubservice.iState );
+        subserviceInfo->SetType( aSubservice.iConnectionInfo.iServiceSelection.iType );
+        subserviceInfo->SetIapId( aSubservice.iConnectionInfo.iIapId );
+        subserviceInfo->SetSNAPId( aSubservice.iConnectionInfo.iSNAPId );    
+        TBool startupFlag( EFalse );
+        iServer.SPSHandler().LoadAtStartUpL( aSubservice.iConnectionInfo.iServiceSelection.iServiceId,
+             aSubservice.iConnectionInfo.iServiceSelection.iType, startupFlag );
+        subserviceInfo->SetStartupFlag( startupFlag );        
+        // Append pointer to array
+        iSubservices.Append( subserviceInfo );
+        }
+   
+    CCHLOGSTRING( "CCCHServiceInfo::AddSubserviceL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::UpdateL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::UpdateL( TBool aReadServiceTable )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::UpdateL: IN" );
+    
+    iIsEnabled = EFalse;
+    if ( aReadServiceTable )
+        {
+        TBool found( EFalse );
+        TInt index( KErrNotFound );
+        TCCHService service;
+        // Read service information from service table
+        iServer.SPSHandler().GetServiceInfoL( iServiceId , service );
+        for ( TInt i( 0 ); i < service.iSubservices.Count(); i++ )
+            {            
+            TCCHSubservice subservice = service.iSubservices[ i ];
+            
+            if ( KErrNotFound != ( index = FindSubservice( 
+                subservice.iConnectionInfo.iServiceSelection.iType ) ) )
+                {
+                TBool startupFlag( EFalse );
+                iServer.SPSHandler().LoadAtStartUpL( subservice.iConnectionInfo.iServiceSelection.iServiceId,
+                    subservice.iConnectionInfo.iServiceSelection.iType, startupFlag );
+                iSubservices[ index ]->SetStartupFlag( startupFlag );
+                iSubservices[ index ]->Update();
+                if ( !iIsEnabled )
+                    {
+                    iIsEnabled = iSubservices[ index ]->IsEnabled();
+                    }
+                }
+            else
+                {
+                AddSubserviceL( subservice );
+                }
+            }
+        // Check that all subservices really exist in service table
+        if ( service.iSubservices.Count() < iSubservices.Count() )
+            {
+            for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+                {                
+                found = ETrue;
+                for ( TInt j( 0 ); j < service.iSubservices.Count() && 
+                    found; j++ )
+                    {
+                    found = 
+                        service.iSubservices[ j ].iConnectionInfo.iServiceSelection.iType == 
+                            iSubservices[ i ]->Type();
+                    }
+                // if this subservice is not in service table then remove it.
+                if ( !found )
+                    {
+                    delete iSubservices[ i ];
+                    iSubservices.Remove( i );
+                    i--;
+                    }                
+                }
+            }
+        }
+    else
+        {
+        for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+            {
+            iSubservices[ i ]->Update();
+            if ( !iIsEnabled )
+                {
+                iIsEnabled = iSubservices[ i ]->IsEnabled();    
+                }
+            }
+        }
+            
+    CCHLOGSTRING( "CCCHServiceInfo::UpdateL: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetStateL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CCCHServiceInfo::SetStateL( 
+    const TCCHSubserviceType aType, 
+    const TInt aState )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::SetStateL IN" );
+    
+    TInt index( FindSubservice( aType ) );
+    if ( KErrNotFound != index )
+        {
+        iSubservices[ index ]->SetState( 
+                static_cast<TCCHSubserviceState>( aState ) );
+        }
+    else
+        {
+        User::Leave( index );
+        }       
+
+    // Before we update our clients handle exception error cases
+    HandleErrorExceptions();
+    UpdateL();    
+    CCHLOGSTRING( "CCCHServiceInfo::SetStateL :OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetStateL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CCCHServiceInfo::SetStateL( 
+    const TUid& aPluginUid, 
+    const TCCHSubserviceState& aState )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::SetStateL IN" );
+    
+    
+    for ( TInt i( 0 ); i < iSubservices.Count() && 
+        i < KCCHMaxSubservicesCount; i++ )
+        {
+        if( aPluginUid == GetUidL( i ) )
+            {
+            iSubservices[ i ]->SetState( aState );
+            }
+        }
+        
+    UpdateL();    
+    CCHLOGSTRING( "CCCHServiceInfo::SetStateL :OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetErrorL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CCCHServiceInfo::SetErrorL( 
+    const TCCHSubserviceType aType, 
+    const TInt aError )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::SetErrorL IN" );
+    
+    TInt index( FindSubservice( aType ) );
+    if ( KErrNotFound != index )
+        {
+        iSubservices[ index ]->SetError( aError );        
+        }
+    else
+        {
+        User::Leave( index );
+        }           
+    CCHLOGSTRING( "CCCHServiceInfo::SetErrorL :OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SubserviceCount
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CCCHServiceInfo::SubserviceCount() const
+    {
+    return iSubservices.Count();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetUidL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TUid CCCHServiceInfo::GetUidL( TInt aSubserviceIndex ) const
+    {
+    if ( aSubserviceIndex > iSubservices.Count() )
+        {
+        User::Leave( KErrNotFound );
+        }
+    return iSubservices[ aSubserviceIndex ]->GetPluginUid();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::FillServiceInfo
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::FillServiceInfo( TCCHService& service )
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::FillServiceInfo: IN" );
+    service.iServiceId = iServiceId;
+    service.iServiceName.Copy( iServiceName );
+    
+    for ( TInt i( 0 ); i < iSubservices.Count() && 
+        i < KCCHMaxSubservicesCount; i++ )
+        {
+        iSubservices[ i ]->FillSubserviceInfo( service.iSubservices.At( i ) );              
+        }
+        
+    CCHLOGSTRING( "CCCHServiceInfo::FillServiceInfo: OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetStatus
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CCCHServiceInfo::GetStatus( 
+    TCCHSubserviceType aType, TCCHSubserviceState& aState ) const
+    {    
+    TInt error = KErrNone;
+    TInt index( FindSubservice( aType ) );
+    
+    if( index == KErrNotFound )
+        {
+        error = KErrNotFound;
+        }
+    else
+        {
+        aState = iSubservices[ index ]->GetState();
+        }
+        
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetState
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TCCHSubserviceState CCCHServiceInfo::GetState() const
+    {    
+    TCCHSubserviceState ret( ECCHUninitialized );
+
+    for ( TInt i( 0 ); i < iSubservices.Count() && !ret; i++ )
+        {
+        if( iSubservices[ i ]->GetState() > ret )
+            {
+            ret = iSubservices[ i ]->GetState();
+            }
+        }
+        
+    CCHLOGSTRING2( "CCCHServiceHandler::GetState: %d", ret );
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetError
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CCCHServiceInfo::GetError( 
+    TCCHSubserviceType aType ) const
+    {    
+    TInt index( FindSubservice( aType ) );
+    return ( KErrNotFound != index ) ? iSubservices[ index ]->GetError() :
+        KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetServiceInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHServiceInfo::GetServiceInfoL( 
+    TDes& aBuffer,
+    TCCHSubserviceType aType ) const
+    {
+    TUid pluginUid( KNullUid );
+    TInt index( FindSubservice( aType ) );
+    if ( KErrNotFound != index )
+        {
+        pluginUid = iSubservices[ index ]->GetPluginUid();
+        
+        User::LeaveIfError( iServer.PluginHandler().GetServiceInfo( 
+            iServiceId, pluginUid, aType, aBuffer ) );
+        }
+    else
+    	{
+    	User::Leave( KErrNotFound );
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SubserviceExist
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CCCHServiceInfo::SubserviceExist( TCCHSubserviceType aType ) const     
+    {
+    // If subservice is specified then check if it really exist.
+    // Otherwise return ETrue
+    return ( ECCHUnknown != aType ) ?  
+        ( ( KErrNotFound != FindSubservice( aType ) ) ? ETrue : EFalse ) :
+        ETrue;
+    }
+    
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::FindSubservice
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CCCHServiceInfo::FindSubservice( TCCHSubserviceType aType ) const
+    {
+    TInt index( KErrNotFound );
+    TBool exist( EFalse );
+    for ( TInt i( 0 ); i < iSubservices.Count() && 
+            i < KCCHMaxSubservicesCount && !exist; i++ )
+        {
+        exist = iSubservices[ i ]->Type() == aType;
+        index = i;
+        }
+    return !exist ? KErrNotFound : index;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::StartupFlagSet
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CCCHServiceInfo::StartupFlagSet() const
+    {
+    TBool ret( EFalse );
+    for ( TInt i( 0 ); i < iSubservices.Count() && !ret; i++ )
+        {
+        ret = iSubservices[ i ]->GetStartUpFlag(); 
+        }
+    CCHLOGSTRING2( "CCCHServiceHandler::StartupFlagSet: %d", ret );        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::StartupFlagSet
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+TBool CCCHServiceInfo::StartupFlagSet( TInt aSubserviceIndex ) const
+    {
+    return aSubserviceIndex > iSubservices.Count() ? EFalse :
+        iSubservices[ aSubserviceIndex ]->GetStartUpFlag();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::SetStartupFlag
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CCCHServiceInfo::SetStartupFlag(
+    TCCHSubserviceType aType,
+    TBool aLoadAtStartUp ) const
+    {
+    TInt exist( KErrNotFound );
+    for ( TInt i( 0 ); i < iSubservices.Count() && 
+            i < KCCHMaxSubservicesCount; i++ )
+        {
+        if ( iSubservices[ i ]->Type() == aType )
+            {
+            iSubservices[ i ]->SetStartupFlag( aLoadAtStartUp );
+            exist = KErrNone;
+            break;
+            }
+        }
+    return exist;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetSubserviceType
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+TCCHSubserviceType CCCHServiceInfo::GetSubserviceType( 
+    TInt aSubserviceIndex ) const
+    {
+    return aSubserviceIndex > iSubservices.Count() ? ECCHUnknown :
+        iSubservices[ aSubserviceIndex ]->Type();
+    }
+    
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::GetSubserviceL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CCCHSubserviceInfo& CCCHServiceInfo::GetSubserviceL( 
+    TCCHSubserviceType aType ) const
+    {
+    TInt index( FindSubservice( aType ) );
+    if ( KErrNotFound == index )
+        {
+        User::Leave( index );
+        }
+        
+    return *iSubservices[ index ];
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHServiceInfo::HandleErrorExceptions
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CCCHServiceInfo::HandleErrorExceptions()
+    {
+    CCHLOGSTRING( "CCCHServiceInfo::HandleErrorExceptions IN" );
+    
+    for ( TInt i( 0 ); i < iSubservices.Count(); i++ )
+        {
+        switch ( iSubservices[ i ]->GetError() )
+            {
+            
+            // KErrCancel caused by CSIPProfileRegistry::ErrorOccurred(-3)
+            // User has canceled connecting dialog and we have to remove
+            // service from the load at startup list.
+            // At last make sure that unnecessary wlan scan is OFF
+            case KErrCancel:
+                {
+                TRAP_IGNORE( iServer.SPSHandler().SetLoadAtStartUpL( 
+                    iServiceId, iSubservices[ i ]->Type(), EFalse ) );
+                iServer.ServiceHandler().DisableWlanScan();
+                }
+                break;
+                
+            default:
+                break;
+            }
+        
+        }
+     
+    CCHLOGSTRING( "CCCHServiceInfo::HandleErrorExceptions :OUT" );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =======================
+
+//  End of File