diff -r 000000000000 -r a4daefaec16c convergedconnectionhandler/cchclientapi/src/cchserviceimpl.cpp --- /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 + +#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 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 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 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 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