diff -r 02103bf20ee5 -r 90dbfc0435e3 bluetoothengine/headsetsimulator/core/src/Tools/hsbtmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/headsetsimulator/core/src/Tools/hsbtmanager.cpp Wed Sep 15 15:59:44 2010 +0200 @@ -0,0 +1,398 @@ +/* + * Component Name: Headset Simulator + * Author: Comarch S.A. + * Version: 1.0 + * Copyright (c) 2010 Comarch S.A. + * + * This Software is submitted by Comarch S.A. to Symbian Foundation Limited on + * the basis of the Member Contribution Agreement entered between Comarch S.A. + * and Symbian Foundation Limited on 5th June 2009 (“Agreement”) and may be + * used only in accordance with the terms and conditions of the Agreement. + * Any other usage, duplication or redistribution of this Software is not + * allowed without written permission of Comarch S.A. + * + */ + +#include "debug.h" +#include "hstools.h" + +CHsBTManager* CHsBTManager::NewL( RSocketServ& aSocketServ, + MHsBTManagerObserver* aBTManagerObserver ) + { + CHsBTManager* self = CHsBTManager::NewLC( aSocketServ, aBTManagerObserver ); + CleanupStack::Pop( self ); // self; + return self; + } + +CHsBTManager* CHsBTManager::NewLC( RSocketServ& aSocketServ, + MHsBTManagerObserver* aBTManagerObserver ) + { + CHsBTManager* self = new ( ELeave ) CHsBTManager( aSocketServ, + aBTManagerObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CHsBTManager::CHsBTManager( RSocketServ& aSocketServ, + MHsBTManagerObserver* aBTManagerObserver ) : + iSocketServ( aSocketServ ), iBTManagerObserver( aBTManagerObserver ) + { + + } + +CHsBTManager::~CHsBTManager() + { + TRACE_FUNC_ENTRY + RestoreInitialSettings(); + + if ( iBTSettings ) + { + delete iBTSettings; + } + if ( iBTConnection ) + { + delete iBTConnection; + } + + if ( iDiscoverer ) + { + delete iDiscoverer; + } + if ( iBTDiscovery ) + { + delete iBTDiscovery; + } + + iDesiredDevAdrress.Close(); + iDesiredName.Close(); + + iBTInitialName.Close(); + iBTName.Close(); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::ConstructL() + { + TRACE_FUNC_ENTRY + iBTSettings = CBTEngSettings::NewL( this ); + iBTConnection = CBTEngConnMan::NewL( this ); + iDiscoverer = CHsDeviceDiscoverer::NewL( this, iSocketServ ); + iBTDiscovery = CBTEngDiscovery::NewL( this ); + + iDesiredName.CreateL( KMaxBluetoothNameLen ); + iDesiredDevAdrress.CreateL( KMaxBluetoothNameLen ); + iBTInitialName.CreateL( KMaxBluetoothNameLen ); + iBTName.CreateL( KMaxBluetoothNameLen ); + + User::LeaveIfError( iBTSettings->GetLocalName( iBTInitialName ) ); + iBTName.Copy( iBTInitialName ); + + User::LeaveIfError( iBTSettings->GetVisibilityMode( + iBTInitialVisibilityMode ) ); + iServiceSet = EFalse; + + User::LeaveIfError( iBTSettings->GetPowerState( iBTInitialPowerState ) ); + TRACE_FUNC_EXIT + } + +void CHsBTManager::SetBTNameL( const TDesC& aBTName ) + { + TRACE_FUNC_ENTRY + iBTName.Copy( aBTName ); + User::LeaveIfError( iBTSettings->SetLocalName( iBTName ) ); + TRACE_FUNC_EXIT + } + +void CHsBTManager::TurnBtOnL( const TDesC& aName ) + { + TRACE_FUNC_ENTRY + User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOn ) ); + SetBTNameL( aName ); + TRACE_FUNC_EXIT + } + +void CHsBTManager::TurnBtOffL() + { + TRACE_FUNC_ENTRY + User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOff ) ); + TRACE_FUNC_EXIT + } + +void CHsBTManager::FindDevL( const TDesC& aDevAddress ) + { + TRACE_FUNC_ENTRY + iDesiredDevAdrress.Zero(); + iDesiredName.Zero(); + + iLookingFor = EDevAddress; + iDesiredDevAdrress.Copy( aDevAddress ); + + TBTPowerStateValue powerState; + User::LeaveIfError( iBTSettings->GetPowerState( powerState ) ); + if ( powerState == EBTPowerOff ) + { + TurnBtOnL(); + } + iDiscoverer->DeviceSearchL(); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::FindNameL( const TDesC& aDeviceName ) + { + TRACE_FUNC_ENTRY + iDesiredDevAdrress.Zero(); + iDesiredName.Zero(); + + iLookingFor = EName; + iDesiredName.Copy( aDeviceName ); + + TBTPowerStateValue powerState; + User::LeaveIfError( iBTSettings->GetPowerState( powerState ) ); + if ( powerState == EBTPowerOff ) + { + TurnBtOnL(); + } + iDiscoverer->DeviceSearchL(); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::SetService( const TUUID& aService ) + { + TRACE_FUNC_ENTRY + iServiceSet = ETrue; + iService = aService; + TRACE_FUNC_EXIT + } + +void CHsBTManager::CancelConnecting() + { + TRACE_FUNC_ENTRY + if ( iDiscoverer ) + iDiscoverer->Cancel(); + TRACE_FUNC_EXIT + } + +TInt CHsBTManager::SetVisible( TBTVisibilityMode aVisibilityMode ) + { + TRACE_FUNC + return iBTSettings->SetVisibilityMode( aVisibilityMode ); + } + +void CHsBTManager::HandleDeviceFindSuccessL( TDesC8& aDevAddress, + TDesC8& aDevName, TUint16 /*aMajServClass*/, TUint /*aMajDeviceClass*/, + TUint8 /*aMinDeviceClass*/) + { + + TRACE_FUNC_ENTRY + + RBuf bufDevAddr; + RBuf bufDevName; + + bufDevAddr.CleanupClosePushL(); + bufDevName.CleanupClosePushL(); + + bufDevAddr.CreateL( aDevAddress.Length() ); + bufDevName.CreateL( aDevName.Length() ); + + bufDevAddr.Copy( aDevAddress ); + bufDevName.Copy( aDevName ); + + TRACE_INFO( (_L("DevName: %S :: DevAddr: %S") , &bufDevName, &bufDevAddr) ) + + if ( ( iLookingFor == EDevAddress ) + && ( aDevAddress == iDesiredDevAdrress ) ) + { + TRACE_INFO( (_L("Desired DevAddr [%S] found"), &bufDevAddr) ) + iDiscoverer->Cancel(); + + if ( KDevAddrLength != iDevAddr.SetReadable( bufDevAddr ) ) + { + iBTManagerObserver->HandleDesiredDeviceNotFound( KErrNotFound ); + } + iDesiredName.Copy( bufDevName ); + TRAPD(err,FindServiceL(iDevAddr, iService)); + + if ( err != KErrNone ) + { + TRACE_INFO( (_L("FindService error: %d"), err) ) + iBTManagerObserver->HandleServiceNotFound( err ); + } + } + else if ( ( iLookingFor == EName ) && ( bufDevName == iDesiredName ) ) + { + TRACE_INFO( (_L("Desired DevName [%S] found"), &bufDevName) ) + iDiscoverer->Cancel(); + + if ( KDevAddrLength != iDevAddr.SetReadable( bufDevAddr ) ) + { + iBTManagerObserver->HandleDesiredDeviceNotFound( KErrNotFound ); + } + TRAPD(err,FindServiceL(iDevAddr, iService)); + + if ( err != KErrNone ) + { + TRACE_INFO( (_L("FindService error: %d"), err) ) + iBTManagerObserver->HandleServiceNotFound( err ); + } + } + + CleanupStack::PopAndDestroy( 2 ); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::HandleDeviceFindFailed( TInt aErr ) + { + + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + iDiscoverer->Cancel(); + + iBTManagerObserver->HandleDesiredDeviceNotFound( aErr ); + TRACE_FUNC_EXIT + } + +void CHsBTManager::PowerStateChanged( TBTPowerStateValue /*aState*/) + { + TRACE_FUNC_ENTRY + + TRACE_FUNC_EXIT + } + +void CHsBTManager::VisibilityModeChanged( TBTVisibilityMode /*aState*/) + { + TRACE_FUNC_ENTRY + + TRACE_FUNC_EXIT + } + +void CHsBTManager::ConnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr, + RBTDevAddrArray* /*aConflicts*/) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::DisconnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::PairingComplete( TBTDevAddr& /*aAddr*/, TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + TRACE_FUNC_EXIT + } + +void CHsBTManager::ServiceSearchComplete( + const RSdpRecHandleArray& /*aResult*/, TUint /*aTotalRecordsCount*/, + TInt /*aErr*/) + { + TRACE_FUNC_ENTRY + + TRACE_FUNC_EXIT + } + +void CHsBTManager::AttributeSearchComplete( TSdpServRecordHandle /*aHandle*/, + const RSdpResultArray& /*aAttr*/, TInt /*aErr*/) + { + TRACE_FUNC_ENTRY + + TRACE_FUNC_EXIT + } + +void CHsBTManager::ServiceAttributeSearchComplete( + TSdpServRecordHandle /*aHandle*/, const RSdpResultArray& aAttr, + TInt aErr ) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + TInt port; + + TInt err = FindPort( aAttr, port ); + iDiscoverer->Cancel(); + + if ( err == KErrNone ) + { + iBTManagerObserver->HandleDesiredDeviceFound( iDesiredName, iDevAddr, + port ); + } + else + { + iBTManagerObserver->HandlePortNotFound( err ); + } + + TRACE_FUNC_EXIT + } + +void CHsBTManager::DeviceSearchComplete( CBTDevice* /*aDevice*/, TInt /*aErr*/) + { + TRACE_FUNC_ENTRY + + TRACE_FUNC_EXIT + } + +void CHsBTManager::RestoreInitialSettings() + { + TRACE_FUNC_ENTRY + // Return values may be ignored, no influence on Headset functionality + iBTSettings->SetLocalName( iBTInitialName ); + iBTSettings->SetPowerState( iBTInitialPowerState ); + iBTSettings->SetVisibilityMode( iBTInitialVisibilityMode ); + TRACE_FUNC_EXIT + } + +void CHsBTManager::FindServiceL( const TBTDevAddr& aDevAddr, + const TUUID& aService ) + { + TRACE_FUNC_ENTRY + + if ( !iServiceSet ) + { + User::Leave( KErrNotReady ); + } + TInt err = iBTDiscovery->RemoteSdpQuery( aDevAddr, aService, + KSdpAttrIdProtocolDescriptorList ); + + if ( err != KErrNone ) + { + iBTManagerObserver->HandleSdpQueryError( err ); + } + TRACE_FUNC_EXIT + } + +TInt CHsBTManager::FindPort( const RSdpResultArray& aAttr, TInt& aPort ) + { + TRACE_FUNC_ENTRY + + TInt err = KErrNotFound; + + for ( TInt i = 0; i < aAttr.Count(); i++ ) + { + TBTEngSdpAttrValue attr = aAttr[i]; + + if ( attr.iAttrType == ETypeUint ) + { + aPort = attr.iAttrValue.iValNumeric; + err = KErrNone; + TRACE_INFO( (_L("Found port: %d"), aPort) ) + break; + } + } + + TRACE_INFO( ( _L("Returned value = %d"), err) ); + TRACE_FUNC_EXIT + return err; + }