bluetoothengine/headsetsimulator/remotecontroller/src/bttools/hsrcbtmanager.cpp
branchheadsetsimulator
changeset 60 90dbfc0435e3
--- /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
+    }
+