diff -r 02103bf20ee5 -r 90dbfc0435e3 bluetoothengine/headsetsimulator/remotecontroller/src/bttools/hsrcbtmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/headsetsimulator/remotecontroller/src/bttools/hsrcbtmanager.cpp Wed Sep 15 15:59:44 2010 +0200 @@ -0,0 +1,378 @@ +/* + * 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 "hsrcbttools.h" +#include "hsrcbttoolsobserver.h" +#include "debug.h" + +CHsRCBTManager* CHsRCBTManager::NewL( RSocketServ& aSServ, + MHsRCBTManagerObserver* aBTManagerObserver ) + { + CHsRCBTManager* self = CHsRCBTManager::NewLC( aSServ, aBTManagerObserver ); + CleanupStack::Pop( self ); // self; + return self; + } + +CHsRCBTManager* CHsRCBTManager::NewLC( RSocketServ& aSServ, + MHsRCBTManagerObserver* aBTManagerObserver ) + { + CHsRCBTManager* self = new ( ELeave ) CHsRCBTManager( aSServ, + aBTManagerObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CHsRCBTManager::~CHsRCBTManager() + { + TRACE_FUNC_ENTRY + TRAP_IGNORE(RestoreInitialSettingsL()); + + if ( iBTSettings ) + { + delete iBTSettings; + } + + if ( iBTConnection ) + { + delete iBTConnection; + } + + if ( iDiscoverer ) + { + delete iDiscoverer; + } + + if ( iBTDiscovery ) + { + delete iBTDiscovery; + } + + iDesiredMAC.Close(); + iDesiredName.Close(); + + iBTInitialName.Close(); + iBTName.Close(); + + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::ConnectDevAddrL( const TBTDevAddr& aDevAddr ) + { + TRACE_FUNC_ENTRY + iDesiredMAC.Zero(); + iDesiredName.Zero(); + + iSearchType = EDevAddr; + aDevAddr.GetReadable( iDesiredMAC ); + + TBTPowerStateValue powerState; + TInt err = iBTSettings->GetPowerState( powerState ); + if ( KErrNone == err && powerState == EBTPowerOff ) + { + TurnOnBTL(); + } + iDiscoverer->DeviceSearchL(); + + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::ConnectDevNameL( const TDesC& aDeviceName ) + { + TRACE_FUNC_ENTRY + iDesiredMAC.Zero(); + iDesiredName.Zero(); + + iSearchType = EDevName; + iDesiredName.Copy( aDeviceName ); + + TBTPowerStateValue powerState; + iBTSettings->GetPowerState( powerState ); + TInt err = iBTSettings->GetPowerState( powerState ); + if ( KErrNone == err && powerState == EBTPowerOff ) + { + TurnOnBTL(); + } + + iDiscoverer->DeviceSearchL(); + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::CancelConnecting() + { + TRACE_FUNC_ENTRY + if ( iDiscoverer ) + iDiscoverer->Cancel(); + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::SetService( const TUUID &aService ) + { + iServiceSet = ETrue; + iService = aService; + } + +CHsRCBTManager::CHsRCBTManager( RSocketServ& aSServ, + MHsRCBTManagerObserver* aBTManagerObserver ) : + iSServ( aSServ ), iBTManagerObserver( aBTManagerObserver ) + { + + } + +void CHsRCBTManager::ConstructL() + { + TRACE_FUNC_ENTRY + iBTSettings = CBTEngSettings::NewL( this ); + iBTConnection = CBTEngConnMan::NewL( this ); + iDiscoverer = CHsRCDeviceDiscoverer::NewL( this, iSServ ); + iBTDiscovery = CBTEngDiscovery::NewL( this ); + + User::LeaveIfError( iDesiredName.Create( KMaxBCBluetoothNameLen ) ); + User::LeaveIfError( iDesiredMAC.Create( KMaxBCBluetoothNameLen ) ); + User::LeaveIfError( iBTInitialName.Create( KMaxBluetoothNameLen ) ); + User::LeaveIfError( iBTName.Create( 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 CHsRCBTManager::PowerStateChanged( TBTPowerStateValue /*aState*/) + { + } + +void CHsRCBTManager::VisibilityModeChanged( TBTVisibilityMode /*aState*/) + { + } + +void CHsRCBTManager::ConnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr, + RBTDevAddrArray* /*aConflicts*/) + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + if ( ( aErr != KErrNone ) && iBTManagerObserver ) + { + iBTManagerObserver->HandleDesiredDevNotFound( aErr ); + } + + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::DisconnectComplete( TBTDevAddr& /*aAddr*/, TInt /*aErr*/) + { + } + +void CHsRCBTManager::PairingComplete( TBTDevAddr& /*aAddr*/, TInt /*aErr*/) + { + } + +void CHsRCBTManager::ServiceSearchComplete( + const RSdpRecHandleArray& /* aResult */, + TUint /* aTotalRecordsCount */, TInt /* aErr */) + { + } + +void CHsRCBTManager::AttributeSearchComplete( + TSdpServRecordHandle /* aHandle */, const RSdpResultArray& /* aAttr */, + TInt /* aErr */) + { + } + +void CHsRCBTManager::ServiceAttributeSearchComplete( + TSdpServRecordHandle /* aHandle */, const RSdpResultArray& aAttr, + TInt /* aErr */) + { + TRACE_FUNC_ENTRY + + TInt port; + + TInt err = FindPort( aAttr, port ); + iDiscoverer->Cancel(); + + if ( ( err == KErrNone ) && ( iBTManagerObserver ) ) + { + iBTManagerObserver->HandleDesiredDevFound( iDesiredName, iDevAddr, + port ); + } + else + { + + if ( iBTManagerObserver ) + { + iBTManagerObserver->HandleDesiredDevNotFound( err ); + } + + } + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::DeviceSearchComplete( CBTDevice* /* aDevice */, + TInt /* aErr */) + { + } + +void CHsRCBTManager::HandleDeviceFindSuccessL( TDesC8& aDevAddr, + TDesC8& aDevName, TUint16 /* aMajServClass */, + TUint /* aMajDeviceClass */, TUint8 /* aMinDeviceClass */) + { + TRACE_FUNC_ENTRY + + RBuf bufAddr; + RBuf bufName; + + bufAddr.CleanupClosePushL(); + bufName.CleanupClosePushL(); + + bufAddr.CreateL( aDevAddr.Length() ); + bufName.CreateL( aDevName.Length() ); + + bufAddr.Copy( aDevAddr ); + bufName.Copy( aDevName ); + + TRACE_INFO( (_L8("DevNAME: %S :: DevADDR: %S") , &aDevName, &aDevAddr) ) + + if ( ( iSearchType == EDevAddr ) && ( bufAddr == iDesiredMAC ) ) + { + iDiscoverer->Cancel(); + TBTDevAddr addr; + + User::LeaveIfError( addr.SetReadable( bufAddr ) ); + + iDevAddr = addr; + iDesiredName.Copy( aDevName ); + TRAPD(err,FindServiceL(iDevAddr, iService)); + + if ( ( err != KErrNone ) && ( iBTManagerObserver ) ) + { + iBTManagerObserver->HandleDesiredDevNotFound( err ); + } + iDesiredMAC.Zero(); + } + + else if ( ( iSearchType == EDevName ) && ( bufName == iDesiredName ) ) + { + + iDiscoverer->Cancel(); + User::LeaveIfError( iDevAddr.SetReadable( bufAddr ) ); + TRAPD(err, FindServiceL(iDevAddr, iService)); + + if ( ( err != KErrNone ) && ( iBTManagerObserver ) ) + { + iBTManagerObserver->HandleDesiredDevNotFound( err ); + } + + iDesiredName.Zero(); + } + + CleanupStack::PopAndDestroy( 2 ); + + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::HandleDeviceFindFailed( TInt aErr ) + { + + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L("aErr = %d"), aErr) ); + + if ( iBTManagerObserver ) + { + iBTManagerObserver->HandleDesiredDevNotFound( aErr ); + } + + TRACE_FUNC_EXIT + } + +TInt CHsRCBTManager::FindPort( const RSdpResultArray& aAttr, TInt& aPort ) + { + TRACE_FUNC_ENTRY + + TInt res = KErrNotFound; + + for ( TInt i = 0; i < aAttr.Count(); i++ ) + { + TBTEngSdpAttrValue attr = aAttr[i]; + + if ( attr.iAttrType == ETypeUint ) + { + aPort = attr.iAttrValue.iValNumeric; + res = KErrNone; + TRACE_INFO( (_L("Found port: %d"), aPort) ); + + } + + } + + TRACE_FUNC_EXIT + return res; + } + +void CHsRCBTManager::RestoreInitialSettingsL() + { + TRACE_FUNC_ENTRY + User::LeaveIfError( iBTSettings->SetLocalName( iBTInitialName ) ); + + User::LeaveIfError( iBTSettings->SetPowerState( iBTInitialPowerState ) ); + + User::LeaveIfError( iBTSettings->SetVisibilityMode( + iBTInitialVisibilityMode ) ); + + TRACE_FUNC_EXIT + } + +void CHsRCBTManager::SetBTNameL( const TDesC& aBTName ) + { + + iBTName.Copy( aBTName ); + User::LeaveIfError( iBTSettings->SetLocalName( iBTName ) ); + + } + +void CHsRCBTManager::TurnOnBTL( const TDesC& aName ) + { + User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOn ) ); + SetBTNameL( aName ); + } + +void CHsRCBTManager::TurnOffBTL() + { + User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOff ) ); + } + +void CHsRCBTManager::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 ) + { + iDiscoverer->DeviceSearchL(); + } + + TRACE_FUNC_EXIT + } +