--- /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;
+ }