convergedconnectionhandler/cchclientapi/src/cchserviceimpl.cpp
changeset 0 a4daefaec16c
child 9 bddb6d4447db
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchclientapi/src/cchserviceimpl.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,588 @@
+/*
+* Copyright (c) 2006-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:  Cch client api
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32def.h>
+
+#include "cchserviceimpl.h"
+#include "cchlogger.h"
+#include "cchimpl.h"
+#include "cchclientobserver.h"
+#include "cchclientserverinternal.h"
+
+#ifdef CCHAPI_USE_CCHUI
+#include "cchuiprivateapi.h"
+#endif
+
+// 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 =============================
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::CCchServiceImpl
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CCchServiceImpl::CCchServiceImpl( CCchImpl& aCch, 
+                                  TInt aServiceId, 
+                                  CCchUiPrivateApi& aCchUi )
+    : iCch( aCch ), 
+      iServiceId( aServiceId ), 
+      iCchUi( aCchUi )
+	{
+	
+    }
+    
+CCchServiceImpl::~CCchServiceImpl()
+    {
+    if( iObserver )
+    	{
+    	RemoveObserver();
+    	}
+    delete iObserver;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CCchServiceImpl::ConstructL()
+    {
+    CCHLOGSTRING( "CCchServiceImpl::ConstructL: IN" );
+    iObserver = CCchClientObserver::NewL( *this );
+    CCHLOGSTRING( "CCchServiceImpl::ConstructL: OUT" );
+    }
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCchServiceImpl* CCchServiceImpl::NewL( CCchImpl& aCch, 
+                                        TInt aServiceId,
+                                        CCchUiPrivateApi& aCchUi )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::NewL: IN" );
+    CCchServiceImpl* self = 
+        CCchServiceImpl::NewLC( aCch, aServiceId, aCchUi );
+    CleanupStack::Pop( self );
+    CCHLOGSTRING( "CCchServiceImpl::NewL: OUT" );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCchServiceImpl* CCchServiceImpl::NewLC( CCchImpl& aCch, TInt aServiceId,
+    CCchUiPrivateApi& aCchUi )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::NewLC: IN" );
+    CCchServiceImpl* self = 
+        new (ELeave) CCchServiceImpl( aCch, aServiceId, aCchUi );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CCHLOGSTRING( "CCchServiceImpl::NewLC: OUT" );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::Enable
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::Enable( TCCHSubserviceType aType )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::Enable: IN" );
+	
+    TRequestStatus status = KErrNone;
+	TServiceSelection selection( iServiceId, aType );
+    iCch.CchClient().EnableService( selection, status, EFalse );
+    //even the cchclient api seems to be asynchronous, 
+	//this method is completed immediately
+	User::WaitForRequest( status );
+    CCHLOGSTRING( "CCchServiceImpl::Enable: OUT" );
+    
+    if ( iCch.ConnectivityDialogsAllowed() )
+        {        
+        TRAPD( err, iCchUi.ManualEnableResultL( 
+            iServiceId, status.Int() ) );
+        
+        if( err != KErrNone )
+            {
+            return KErrNotReady;
+            }
+        }
+    
+    return status.Int();
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::Disable
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::Disable( TCCHSubserviceType aType )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::Disable: IN" );
+    
+    TRequestStatus status = KErrNone;
+	TServiceSelection selection( iServiceId, aType );
+    iCch.CchClient().DisableService( selection, status );
+    //even the cchclient api seems to be asynchronous, 
+	//this method is completed immediately
+	User::WaitForRequest( status );
+    CCHLOGSTRING( "CCchServiceImpl::Disable: OUT" );
+    return status.Int();
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::GetStatus
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::GetStatus( TCCHSubserviceType aType, 
+                                 TCchServiceStatus& aStatus ) const
+    {
+    CCHLOGSTRING( "CCchServiceImpl::GetStatus: IN" );
+    TCCHSubserviceState state( ECCHUninitialized );
+    TServiceSelection selection( iServiceId, aType );
+    TInt error = iCch.CchClient().GetServiceState( selection, state );
+    //if this is a cch error, return it in the structure, otherwise in return
+    if( KCCHErrorInvalidIap >= error || KErrNone == error )
+    	{
+        aStatus.SetError( error );
+        aStatus.SetState( state );
+        error = KErrNone;
+    	}
+    CCHLOGSTRING( "CCchServiceImpl::GetStatus: OUT" );
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::GetConnectionParameter
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::GetConnectionParameter( TCCHSubserviceType aType, 
+		TCchConnectionParameter aParameter, TInt& aValue ) const
+    {
+    CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: IN" );
+    TRequestStatus status = KErrNone;
+    
+    switch( aParameter )
+    {
+    	case ECchIapId:
+    	case ECchSnapId:
+    	case ECchSnapLocked:
+        case ECchPasswordSet:
+        case ECchReserved:
+    		{
+    		TServiceSelection selection( iServiceId, aType, aParameter );
+    	    TServiceConnectionInfo serviceConnInfo;
+    	    TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
+    	    
+    		iCch.CchClient().GetConnectionInfo( selection, 
+    	    		serviceConnInfoPckg, status );
+    	    //even the cchclient api seems to be asynchronous, 
+    		//this method is completed immediately
+    		User::WaitForRequest( status );
+    		if ( KErrNone == status.Int() )
+    	        {
+    	        serviceConnInfo = serviceConnInfoPckg();
+    	        if( ECchSnapId == aParameter )
+    	        	{
+    	        	aValue = serviceConnInfo.iSNAPId;
+    	        	}
+    	        else if( ECchIapId == aParameter )
+    	        	{
+    	        	aValue = serviceConnInfo.iIapId;
+    	        	}
+    	        else if( ECchSnapLocked == aParameter )
+    	        	{
+    	        	aValue = serviceConnInfo.iSNAPLocked;
+    	        	}
+    	        else  if( ECchPasswordSet == aParameter )
+                    {
+                    aValue = serviceConnInfo.iPasswordSet;
+                    }
+                else  if( ECchReserved == aParameter )
+                    {
+                    aValue = serviceConnInfo.iReserved;
+                    }
+    	        }
+    		}
+    		break;
+        default:
+            {
+            status = KErrArgument;
+            }
+            break;
+    }
+    
+	CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: OUT" );
+    return status.Int();
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::SetConnectionParameter
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::SetConnectionParameter( TCCHSubserviceType aType, 
+		TCchConnectionParameter aParameter, TInt aValue )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: IN" );
+    TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
+    TRequestStatus status = KErrNone;
+    TInt error = KErrNone;
+    
+    switch( aParameter )
+    {
+    	case ECchIapId:
+    	case ECchSnapId:
+        case ECchReserved:
+    		{
+    		serviceConnInfoPckg().SetServiceId( iServiceId );
+    	    serviceConnInfoPckg().SetType( aType );
+    	    if( ECchSnapId == aParameter )
+	        	{
+	        	serviceConnInfoPckg().iSNAPId = aValue;
+	        	}
+	        else if ( ECchIapId == aParameter )
+	        	{
+	        	serviceConnInfoPckg().iIapId = aValue;
+	        	}
+            else if ( ECchReserved == aParameter )
+                {
+                serviceConnInfoPckg().SetParameter( aParameter );
+                serviceConnInfoPckg().iReserved = aValue;
+                }
+            else
+                {
+                return KErrArgument;
+                }
+    	    iCch.CchClient().SetConnectionInfo( serviceConnInfoPckg, status );
+    	    //even the cchclient api seems to be asynchronous, 
+    		//this method is completed immediately
+    		User::WaitForRequest( status );
+    		error = status.Int();
+    		}
+    		break;
+    	case ECchSnapLocked:
+        case ECchPasswordSet:
+    		{
+    		error = KErrNotSupported;
+    		}
+    		break;
+        default:
+            {
+            error = KErrArgument;
+            }
+            break;
+    }
+    
+    CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: OUT" );
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::GetConnectionParameters
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::GetConnectionParameter( TCCHSubserviceType aType, 
+		TCchConnectionParameter aParameter, RBuf& aValue ) const
+    {
+    CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: IN" );
+    TServiceSelection selection( iServiceId, aType, aParameter );
+    TRequestStatus status = KErrNone;
+    TInt error = KErrNone; 
+    
+    switch( aParameter )
+    {
+        case ECchServiceInfo:
+    		{
+    		error = iCch.CchClient().GetServiceInfo( selection, aValue );
+    		}
+    		break;
+
+        case ECchUsername:
+            {
+            TServiceConnectionInfo serviceConnInfo;
+            TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
+            
+            iCch.CchClient().GetConnectionInfo( selection,serviceConnInfoPckg, status );
+            //even the cchclient api seems to be asynchronous, 
+            //this method is completed immediately
+            User::WaitForRequest( status );
+
+            serviceConnInfo = serviceConnInfoPckg();
+            aValue = serviceConnInfo.iUsername;
+            }
+            break;
+        case ECchPassword:
+            {
+            error = KErrNotSupported;
+            }
+            break;
+        default:
+            {
+            error = KErrArgument;
+    		}
+    		break;
+    }
+    
+	CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: OUT" );
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::SetConnectionParameters
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::SetConnectionParameter( TCCHSubserviceType aType, 
+		TCchConnectionParameter aParameter, const TDesC& aValue )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: IN" );
+    CCHLOGSTRING2( "    aValue:     %S", &aValue );
+
+    // Type of subservice has to be ECCHUnknown for username and password
+    __ASSERT_ALWAYS( aType == ECCHUnknown,
+                    User::Panic( KNullDesC, KErrArgument ) );
+    
+    TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
+    TRequestStatus status = KErrNone;
+    TInt error = KErrNone;
+
+    switch( aParameter )
+    {
+        case ECchUsername:
+            {
+            serviceConnInfoPckg().SetServiceId( iServiceId );
+            serviceConnInfoPckg().SetType( aType );
+            serviceConnInfoPckg().SetParameter( aParameter );
+
+            if ( aValue.Length() < KCCHMaxUsernameLength )
+                {
+                serviceConnInfoPckg().iUsername.Append( aValue );
+                
+                iCch.CchClient().SetConnectionInfo( serviceConnInfoPckg, status );
+                //even the cchclient api seems to be asynchronous, 
+                //this method is completed immediately
+                User::WaitForRequest( status );
+                error = status.Int();
+                }
+            else
+                {
+                error = KErrArgument;
+                }
+            }
+            break;
+        case ECchPassword:
+            {
+            serviceConnInfoPckg().SetServiceId( iServiceId );
+            serviceConnInfoPckg().SetType( aType );
+            serviceConnInfoPckg().SetParameter( aParameter );
+            if ( aValue.Length() < KCCHMaxPasswordLength )
+                {
+                serviceConnInfoPckg().iPassword.Append( aValue );
+                
+                iCch.CchClient().SetConnectionInfo( serviceConnInfoPckg, status );
+                //even the cchclient api seems to be asynchronous, 
+                //this method is completed immediately
+                User::WaitForRequest( status );
+                error = status.Int();
+                }
+            else
+                {
+                error = KErrArgument;
+                }
+            }
+            break;
+        default:
+            {
+            error = KErrArgument;
+            }
+            break;
+    }
+    
+    CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: OUT" );
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::Reserve
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::Reserve( TCCHSubserviceType aType )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::Reserve: IN" );
+    TServiceSelection selection( iServiceId, aType );
+    TInt error = iCch.CchClient().ReserveService( selection );
+    CCHLOGSTRING( "CCchServiceImpl::Reserve: OUT" );
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::Free
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::Free( TCCHSubserviceType aType )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::Free: IN" );
+    TServiceSelection selection( iServiceId, aType );
+    TInt error = iCch.CchClient().FreeService( selection );
+    CCHLOGSTRING( "CCchServiceImpl::Free: OUT" );
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::IsReserved
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::IsReserved( TCCHSubserviceType aType, 
+                                   TBool& aReserved ) const
+    {
+    CCHLOGSTRING( "CCchServiceImpl::IsReserved: IN" );
+    TServiceSelection selection( iServiceId, aType );
+    aReserved = iCch.CchClient().IsReserved( selection );
+    CCHLOGSTRING( "CCchServiceImpl::IsReserved: OUT" );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::ServiceId
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::ServiceId() const
+    {
+    CCHLOGSTRING( "CCchServiceImpl::ServiceId: IN" );
+    return iServiceId;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchServiceImpl::IsSupported
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::IsSupported( TCCHSubserviceType aType, 
+                                   TBool& aSupported ) const
+    {
+    CCHLOGSTRING( "CCchServiceImpl::IsSupported: IN" );
+    TCCHSubserviceState state( ECCHUninitialized );
+    TServiceSelection selection( iServiceId, aType );
+    TInt error = iCch.CchClient().GetServiceState( selection, state );
+    if( error == KErrNone ||
+    	error <= KCCHErrorInvalidIap ) // cch errors are ok
+    	{
+    	aSupported = ETrue;
+    	}
+    else
+    	{
+    	aSupported = EFalse;
+    	}
+	
+	CCHLOGSTRING( "CCchServiceImpl::IsSupported: OUT" );
+    return error;
+    }      
+
+// ---------------------------------------------------------------------------
+// CCchClientObserver::SetObserver
+// ---------------------------------------------------------------------------
+//
+void CCchServiceImpl::SetObserver( MCchServiceStatusObserver& aObserver )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::SetObserver: IN - deprecated - do not use this anymore " );
+    iObserver->SetObserver( aObserver );
+    CCHLOGSTRING( "CCchServiceImpl::SetObserver: OUT  - deprecated - do not use this anymore " );
+    }
+    
+// ---------------------------------------------------------------------------
+// CCchClientObserver::RemoveObserver
+// ---------------------------------------------------------------------------
+//
+void CCchServiceImpl::RemoveObserver( )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: IN - deprecated - do not use this anymore " );
+    iObserver->RemoveObserver( );
+    CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: OUT - deprecated - do not use this anymore " );
+    }
+
+// ---------------------------------------------------------------------------
+// CCchClientObserver::AddObserver
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::AddObserver( 
+                      MCchServiceStatusObserver& aObserver )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::AddObserver: IN" );
+    TInt err = iObserver->AddObserver( aObserver );
+    CCHLOGSTRING( "CCchServiceImpl::AddObserver: OUT" );
+    
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchClientObserver::RemoveObserver
+// ---------------------------------------------------------------------------
+//
+TInt CCchServiceImpl::RemoveObserver( 
+                     MCchServiceStatusObserver& aObserver )
+    {
+    CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: IN" );
+    TInt err = iObserver->RemoveObserver( aObserver );
+    CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: OUT" );
+    
+    return err;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCchClientObserver::CchImpl
+// ---------------------------------------------------------------------------
+//
+CCchImpl* CCchServiceImpl::CchImpl() const
+	{
+	return &iCch;
+	}
+
+
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+
+//  End of File