bluetoothengine/headsetsimulator/remotecontroller/src/bttools/hsrcbtmanager.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 "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
    }