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