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