bluetoothengine/headsetsimulator/core/src/Tools/hsbtmanager.cpp
author michal.sulewski
Wed, 15 Sep 2010 15:59:44 +0200
branchheadsetsimulator
changeset 60 90dbfc0435e3
permissions -rw-r--r--
source code commit

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