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