diff -r 000000000000 -r f63038272f30 bluetoothengine/bteng/src/btengclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/bteng/src/btengclient.cpp Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,294 @@ +/* +* Copyright (c) 2006 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: Client-side implementation of BTEng +* +*/ + + + +#include +#include + +#include "btengclient.h" +#include "debug.h" + +/** Number of retries for connecting to BTEng server side */ +const TInt KBTEngConnectAttempts = 3; + + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// ?description +// --------------------------------------------------------------------------- +// +TInt ClientStart() + { + TRACE_FUNC_ENTRY + const TUidType serverUid( KNullUid, KNullUid, KBTEngServerUid3 ); + // Create a new server process. Simultaneous launching of two processes + // should be detected when the second one attempts to create the server + // object, failing with KErrAlreadyExists. + RProcess server; + TInt err = server.Create( KBTEngServerName, KNullDesC, serverUid ); + if( err != KErrNone ) + { + TRACE_INFO( ( _L( "[BTEng]\t Server process creation failed %d" ), err ) ); + return err; + } + TRequestStatus status; + server.Rendezvous( status ); + if( status != KRequestPending ) + { + TRACE_INFO( ( _L( "[BTEng]\t wrong status (%d), kill process"), + status.Int() ) ) + server.Kill( KErrCancel ); // Abort startup + } + else + { + TRACE_INFO( ( _L( "[BTEng]\t Server process launched") ) ) + server.Resume(); + } + User::WaitForRequest( status ); // Wait for start or death + err = status.Int(); + if( server.ExitType() == EExitPanic ) + { + // The server actually panicked; inform the client. + err = KErrDied; + } + server.Close(); + TRACE_FUNC_RES( ( _L( "result %d" ), err ) ) + return err; + } + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +RBTEng::RBTEng() +: RSessionBase() + { + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::Connect() + { + TRACE_FUNC_ENTRY + TInt err = KErrNone; + for( TInt i = 0; i < KBTEngConnectAttempts; i++ ) + { + err = CreateSession( KBTEngServerName, Version() ); + if( err == KErrNone ) + { + break; // Success + } + else if( err == KErrNotFound || err == KErrServerTerminated ) + { + // Session could not be created, + // first the server needs to be started. + err = ClientStart(); + } + if( err != KErrNone && err != KErrAlreadyExists ) + { + // If the server cannot be started for other reasons than + // KErrAlreadyExists, give up... + break; + } + } + TRACE_FUNC_RES( ( _L("result %d"), err ) ) + return err; + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TVersion RBTEng::Version() + { + return TVersion( KBTEngServerVersionMajor, KBTEngServerVersionMinor, + KBTEngServerVersionBuild ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::SetPowerState( const TBTPowerStateValue aState, const TBool aTemp ) + { + return SendReceive( EBTEngSetPowerState, TIpcArgs( aState, aTemp ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::SetVisibilityMode( const TBTVisibilityMode aMode, const TInt aTime ) + { + return SendReceive( EBTEngSetVisibilityMode, TIpcArgs( aMode, aTime ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::ConnectDevice( const TBTDevAddr& aAddr, + const TBTDeviceClass& aDeviceClass ) + { + TRACE_BDADDR(aAddr); + TBTDevAddrPckgBuf addrPkg( aAddr ); + TBTEngDevClassPkg codPkg( aDeviceClass.DeviceClass() ); + return SendReceive( EBTEngConnectDevice, TIpcArgs( &addrPkg, &codPkg ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::CancelConnectDevice( const TBTDevAddr& aAddr ) + { + TRACE_BDADDR(aAddr); + TBTDevAddrPckgBuf addrPkg( aAddr ); + return SendReceive( EBTEngCancelConnectDevice, TIpcArgs( &addrPkg ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::DisconnectDevice( const TBTDevAddr& aAddr, + TBTDisconnectType aDiscType ) + { + TRACE_BDADDR(aAddr); + TBTDevAddrPckgBuf addrPkg( aAddr ); + TBTEngParamPkg discPkg( aDiscType ); + return SendReceive( EBTEngDisconnectDevice, TIpcArgs( &addrPkg, &discPkg ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::IsDeviceConnected( const TBTDevAddr& aAddr, + TBTEngConnectionStatus& aConnected ) + { + TRACE_BDADDR(aAddr); + TBTDevAddrPckgBuf addrPkg( aAddr ); + TBTEngParamPkg connPkg( aConnected ); + TInt err = SendReceive( EBTEngIsDeviceConnected, TIpcArgs( &addrPkg, &connPkg ) ); + aConnected = (TBTEngConnectionStatus) connPkg(); + return err; + } + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::IsDeviceConnectable( const TBTDevAddr& aAddr, + const TBTDeviceClass& aDeviceClass, TBool& aConnectable ) + { + TRACE_BDADDR(aAddr); + TBTDevAddrPckgBuf addrPkg( aAddr ); + TBTEngDevClassPkg codPkg( aDeviceClass.DeviceClass() ); + TBTEngParamPkg connPkg( aConnectable ); + TInt err = SendReceive( EBTEngIsDeviceConnectable, TIpcArgs( &addrPkg, &codPkg, &connPkg ) ); + aConnectable = connPkg(); + return err; + } + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::GetConnectedAddresses( TDes8& aArrayPkg, TBTEngParamPkg& aProfilePkg ) + { + return SendReceive( EBTEngGetConnectedAddresses, + TIpcArgs( &aArrayPkg, &aProfilePkg ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::NotifyConnectionEvents( TDes8& aEvent, TRequestStatus& aStatus ) + { + // Use the third slot for the event package. + SendReceive( EBTEngNotifyConnectionEvents, + TIpcArgs( NULL, NULL, &aEvent ), aStatus ); + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::CancelNotifyConnectionEvents() + { + return SendReceive( EBTEngCancelEventNotifier, TIpcArgs() ); + } + + +// --------------------------------------------------------------------------- +// Set a pairing observer in BTEngine. +// --------------------------------------------------------------------------- +// +TInt RBTEng::SetPairingObserver( const TBTDevAddr& aAddr, TBool aActivate ) + { + TBTDevAddrPckgBuf addrPkg( aAddr ); + return SendReceive( EBTEngSetPairingObserver, TIpcArgs( &addrPkg, aActivate ) ); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt RBTEng::PrepareDiscovery() + { + return SendReceive( EBTEngPrepareDiscovery, TIpcArgs() ); + } + +// --------------------------------------------------------------------------- +// Start to pair a device in BTEngine. +// --------------------------------------------------------------------------- +// +void RBTEng::PairDevice( const TBTDevAddrPckgBuf& aAddr, + const TUint32& aDeviceClass, TRequestStatus& aStatus ) + { + SendReceive( EBTEngPairDevice, TIpcArgs( &aAddr, aDeviceClass ), aStatus ); + } + +// --------------------------------------------------------------------------- +// cancel pairing request +// --------------------------------------------------------------------------- +// +void RBTEng::CancelPairDevice( ) + { + (void) SendReceive( EBTEngCancelPairDevice); + }