bluetoothengine/headsetsimulator/core/src/Tools/hsbtmanager.cpp
branchheadsetsimulator
changeset 60 90dbfc0435e3
--- /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;
+    }