diff -r f742655b05bf -r d38647835c2e convergedconnectionhandler/cchclientapi/src/cchimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/convergedconnectionhandler/cchclientapi/src/cchimpl.cpp Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,434 @@ +/* +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: cch client api implementation +* +*/ + + +// INCLUDE FILES +#include "cchimpl.h" +#include "cchlogger.h" +#include "cch.h" +#include "cchserviceimpl.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 ============================= + +// --------------------------------------------------------------------------- +// CCchImpl::CCchImpl +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CCchImpl::CCchImpl() + : CActive ( EPriorityStandard ), + iCchUi(0), + iConnectivityDialogsAllowed( EFalse ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CCchImpl::destructor +// --------------------------------------------------------------------------- +// +CCchImpl::~CCchImpl() + { + CCHLOGSTRING( "CCchImpl::~CCchImpl: IN" ); + + delete iCchUi; + + iCchServiceImpls.ResetAndDestroy(); + iCchServiceImpls.Close(); + Cancel(); + + iCchClient.Close(); + iCchServer.Close(); + + CCHLOGSTRING( "CCchImpl::~CCchImpl: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchImpl::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CCchImpl::ConstructL( CCch& aCch ) + { + CCHLOGSTRING( "CCchImpl::ConstructL: IN" ); + + User::LeaveIfError( iCchServer.Connect() ); + User::LeaveIfError( iCchClient.Open( iCchServer ) ); + +#ifdef CCHAPI_USE_CCHUI + iCchUi = CCchUiPrivateApi::NewL( aCch ); +#endif + + iCchClient.RegisterToServer( iStatus ); + SetActive(); + + CCHLOGSTRING( "CCchImpl::ConstructL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchImpl::NewL +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CCchImpl* CCchImpl::NewL( CCch& aCch ) + { + CCHLOGSTRING( "CCchImpl::NewL: IN" ); + CCchImpl* self = + CCchImpl::NewLC( aCch ); + CleanupStack::Pop( self ); + CCHLOGSTRING( "CCchImpl::NewL: OUT" ); + return self; + } + +// --------------------------------------------------------------------------- +// CCchImpl::NewLC +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CCchImpl* CCchImpl::NewLC( CCch& aCch ) + { + CCHLOGSTRING( "CCchImpl::NewLC: IN" ); + CCchImpl* self = + new (ELeave) CCchImpl( ); + CleanupStack::PushL( self ); + self->ConstructL( aCch ); + CCHLOGSTRING( "CCchImpl::NewLC: OUT" ); + return self; + } + +// --------------------------------------------------------------------------- +// CCchImpl::NewLC +// Returns the RCCHClient +// --------------------------------------------------------------------------- +// +RCCHClient& CCchImpl::CchClient( ) + { + CCHLOGSTRING( "CCchImpl::CchClient: IN OUT" ); + return iCchClient; + } + +// --------------------------------------------------------------------------- +// CCchImpl::GetService +// --------------------------------------------------------------------------- +// +CCchService* CCchImpl::GetService( TInt aId ) + { + CCHLOGSTRING( "CCchImpl::GetService: IN" ); + + CCchServiceImpl* cchServiceImpl = NULL; + + TInt idx = FindService( aId ); + if( idx == KErrNotFound ) + { + TInt error = KErrNone; + TRAP( error, cchServiceImpl = GetServiceL( aId ) ); + } + else + { + cchServiceImpl = iCchServiceImpls[ idx ]; + } + CCHLOGSTRING( "CCchImpl::GetService: OUT" ); + return cchServiceImpl; + } + +// --------------------------------------------------------------------------- +// CCchImpl::GetServiceL +// --------------------------------------------------------------------------- +// +CCchServiceImpl* CCchImpl::GetServiceL( TInt aId ) + { + CCchServiceImpl* cchServiceImpl = NULL; + + CArrayFixFlat* cchServices = + new ( ELeave ) CArrayFixFlat( 1 ); + CleanupStack::PushL( cchServices ); + if( KErrNone == GetCchServicesL( aId, ECCHUnknown , *cchServices ) ) + { + if( cchServices->Count() ) + { + TCCHService service = cchServices->At( 0 ); + cchServiceImpl = CCchServiceImpl::NewL( *this, + service.iServiceId, + *iCchUi ); + + TInt error = iCchServiceImpls.Append( cchServiceImpl ); + if( error == KErrNone ) + { + cchServiceImpl = iCchServiceImpls[ iCchServiceImpls.Count() - 1 ]; + } + else + { + delete cchServiceImpl; + cchServiceImpl = NULL; + } + } + } + cchServices->Reset(); + CleanupStack::PopAndDestroy( cchServices ); + return cchServiceImpl; + } + + +// --------------------------------------------------------------------------- +// CCchImpl::GetCchServiceL +// --------------------------------------------------------------------------- +// +TInt CCchImpl::GetCchServicesL( TInt aServiceId, TCCHSubserviceType aType, + CArrayFixFlat& aServices ) + { + TServiceSelection selection( aServiceId, aType, ECchInitial ); + TRequestStatus status = KErrNone; + + iCchClient.GetServicesL( selection, aServices, status ); + //even the cchclient api seems to be asynchronous, + //this method is completed immediately + User::WaitForRequest( status ); + return status.Int(); + } + +// --------------------------------------------------------------------------- +// CCchImpl::GetServiceIdsL +// --------------------------------------------------------------------------- +// +void CCchImpl::GetServiceIdsL( RArray& aIds ) + { + CCHLOGSTRING( "CCchImpl::GetServiceIdsL: IN" ); + + TRequestStatus status( KErrNone ); + CArrayFixFlat* cchServices = new (ELeave) CArrayFixFlat(1); + CleanupStack::PushL( cchServices ); + + iCchClient.GetServicesL( *cchServices, status ); + + //even the cchclient api seems to be asynchronous, + //this method is completed immediately + User::WaitForRequest( status ); + if( KErrNone == status.Int() ) + { + for ( TInt i = 0; i < cchServices->Count(); i++ ) + { + TCCHService service = cchServices->At( i ); + User::LeaveIfError( aIds.Append( service.iServiceId ) ); + } + } + else + { + User::Leave( status.Int() ); + } + CleanupStack::PopAndDestroy( cchServices ); + + CCHLOGSTRING( "CCchImpl::GetServiceIdsL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchImpl::GetServiceIds +// --------------------------------------------------------------------------- +// +TInt CCchImpl::GetServiceIds( RArray& aIds ) + { + TRAPD( err, GetServiceIdsL( aIds ) ); + + return err; + } + +// --------------------------------------------------------------------------- +// CCchImpl::GetServices +// --------------------------------------------------------------------------- +// +TInt CCchImpl::GetServices( TCCHSubserviceType aType, + RPointerArray& aServices ) + { + TInt err = KErrNone; + TRAP( err, GetServicesL( aType, aServices ) ); + return err; + } + +// --------------------------------------------------------------------------- +// CCchImpl::GetServicesL +// --------------------------------------------------------------------------- +// +void CCchImpl::GetServicesL( TCCHSubserviceType aType, + RPointerArray& aServices ) + { + CCHLOGSTRING( "CCchImpl::GetServicesL: IN" ); + + CleanupClosePushL( aServices ); // CS: 1 + + TInt error = KErrNone; + TServiceSelection selection( 0, aType, ECchInitial ); + + CCchServiceImpl* cchServiceImpl = NULL; + CArrayFixFlat* cchServices; + cchServices = new (ELeave) CArrayFixFlat(1); + CleanupStack::PushL( cchServices ); // CS: 2 + error = GetCchServicesL( 0, aType, *cchServices ); + + if( KErrNone == error ) + { + for ( TInt i = 0; i < cchServices->Count(); i++ ) + { + TCCHService service = cchServices->At( i ); + TInt idx = FindService( service.iServiceId ); + + if( KErrNotFound == idx ) + { + cchServiceImpl = CCchServiceImpl::NewLC( *this, // CS: 3 + service.iServiceId, *iCchUi ); + iCchServiceImpls.AppendL( cchServiceImpl ); + CleanupStack::Pop( cchServiceImpl ); // CS: 2 + } + else + { + cchServiceImpl = iCchServiceImpls[ idx ]; + } + + aServices.AppendL( cchServiceImpl ); + } + } + + cchServices->Reset(); + CleanupStack::PopAndDestroy( cchServices ); // CS: 1 + User::LeaveIfError( error ); + CleanupStack::Pop( &aServices ); // CS: 0 + + CCHLOGSTRING( "CCchImpl::GetServicesL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCCHServiceHandler::FindService +// --------------------------------------------------------------------------- +// +TInt CCchImpl::FindService( TInt aServiceId ) const + { + TBool exist = EFalse; + TInt index = KErrNotFound; + CCHLOGSTRING2( "CCchImpl::FindService: serviceId %d", aServiceId ); + for ( TInt i = 0; i < iCchServiceImpls.Count() && !exist; i++ ) + { + exist = iCchServiceImpls[i]->ServiceId() == aServiceId; + index = i; + } + return !exist ? KErrNotFound : index; + } + +// --------------------------------------------------------------------------- +// CCCHServiceHandler::ConnectivityDialogsAllowed +// --------------------------------------------------------------------------- +// +TBool CCchImpl::ConnectivityDialogsAllowed() const + { + CCHLOGSTRING( "CCchImpl::ConnectivityDialogsAllowed" ); + CCHLOGSTRING2( " --> iConnectivityDialogsAllowed=%d", + iConnectivityDialogsAllowed ); + + return iConnectivityDialogsAllowed; + } + +// --------------------------------------------------------------------------- +// CCCHServiceHandler::SetConnectivityDialogsAllowed +// --------------------------------------------------------------------------- +// +void CCchImpl::SetConnectivityDialogsAllowed( + TBool aConnectivityDialogsAllowed ) + { + iConnectivityDialogsAllowed = aConnectivityDialogsAllowed; + } + +// --------------------------------------------------------------------------- +// CCCHServiceHandler::CchUiApi +// --------------------------------------------------------------------------- +// +MCchUi& CCchImpl::CchUiApi() const + { + return *iCchUi; + } + +// --------------------------------------------------------------------------- +// CCchImpl::DoCancel +// --------------------------------------------------------------------------- +// +void CCchImpl::DoCancel() + { + CCHLOGSTRING( "CCchImpl::DoCancel: IN" ); + iCchClient.RegisterToServerCancel(); + CCHLOGSTRING( "CCchImpl::DoCancel: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchImpl::RunL +// --------------------------------------------------------------------------- +// +void CCchImpl::RunL() + { + CCHLOGSTRING( "CCchImpl::RunL: IN" ); + if ( iStatus.Int() == KErrServerTerminated ) + { + // clean + Cancel(); + iCchClient.Close(); + iCchServer.Close(); + + // create new + User::LeaveIfError( iCchServer.Connect() ); + User::LeaveIfError( iCchClient.Open( iCchServer ) ); + + iCchClient.RegisterToServer( iStatus ); + SetActive(); + } + CCHLOGSTRING( "CCchImpl::RunL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchImpl::RunL +// --------------------------------------------------------------------------- +// +TInt CCchImpl::RunError( TInt /*aError*/ ) + { + return KErrNone; + } + +// End of File