diff -r dbd1c5e08735 -r 453dfc402455 connectivitymodules/SeCon/servers/pcconn/src/sconbtengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/src/sconbtengine.cpp Thu Aug 19 10:44:03 2010 +0300 @@ -0,0 +1,415 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CSconBtEngine implementation +* +*/ + + + +#include +#include + +#include +#include +#include + +#include "sconbtengine.h" +#include "debug.h" + +CSconBtEngine* CSconBtEngine::NewL() + { + TRACE_FUNC; + CSconBtEngine* self = new (ELeave) CSconBtEngine(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CSconBtEngine::~CSconBtEngine() + { + TRACE_FUNC; + if ( iBtEng ) + { + iBtEng->Cancel(); + delete iBtEng; + } + + delete iBtSettings; + } + +CSconBtEngine::CSconBtEngine() + { + } + +void CSconBtEngine::ConstructL() + { + iBtEng = CBTEngDevMan::NewL( this ); + iBtSettings = CBTEngSettings::NewL( this ); + iState = EIdle; + } + +void CSconBtEngine::ReadBTInfoL( RBufWriteStream& aStream ) + { + TRACE_FUNC_ENTRY; + if ( iState != EIdle ) + { + User::Leave( KErrInUse ); + } + iStream = &aStream; + iOperationError = KErrNone; + + // Write local name (8 bit name length + unicode name) + TBuf<100> localName; + TInt err = iBtSettings->GetLocalName( localName ); + User::LeaveIfError( err ); + LOGGER_WRITE_1("localName: %S", &localName); + iStream->WriteUint8L( localName.Length() ); + iStream->WriteL( localName, localName.Length() ); + + if ( iBtAddress.Length() == 0 ) + { + LOGGER_WRITE("Try to read bt address"); + + CRepository* cenRep = NULL; + // Use TRAP to catch a leave if the CenRep key does not exist. + TRAP( err, cenRep = CRepository::NewL( KCRUidBluetoothLocalDeviceAddress ) ); + CleanupStack::PushL( cenRep ); + if( !err ) + { + err = cenRep->Get( KBTLocalDeviceAddress, iBtAddress ); + LOGGER_WRITE_1("cenRep->Get err: %d", err); + } + CleanupStack::PopAndDestroy( cenRep ); + + if ( err ) + { + iBtAddress.Zero(); + } + } + + // Write bt address (8 bit addr length + unicode address) + if ( iBtAddress.Length() > 0 ) + { + LOGGER_WRITE_1("btAddr: %S", &iBtAddress); + iStream->WriteUint8L( iBtAddress.Length() ); + iStream->WriteL( iBtAddress, iBtAddress.Length() ); + } + else + { + iStream->WriteUint8L( 0 ); + } + + // Write BT Power State (8-bit, 0=Off, 1=On) + TBTPowerStateValue state; + err = iBtSettings->GetPowerState( state ); + User::LeaveIfError( err ); + LOGGER_WRITE_1("PowerState: %d", state); + iStream->WriteUint8L( state ); + + // Get device info + TBTRegistrySearch crit; + crit.FindAll(); + if ( !iBtDevArray ) + { + LOGGER_WRITE("create arr"); + iBtDevArray = new (ELeave) CBTDeviceArray(5); + LOGGER_WRITE("create arr -ok"); + } + else + { + iBtDevArray->ResetAndDestroy(); + } + err = iBtEng->GetDevices( crit, iBtDevArray ); + LOGGER_WRITE_1("GetDevices err: %d", err); + User::LeaveIfError( err ); + iState = ERequestBtInfo; + + // Wait until completed + iWait.Start(); + iState = EIdle; + if ( iOperationError ) + { + LOGGER_WRITE_1("Operation failed, leave %d", iOperationError); + User::Leave( iOperationError ); + } + TRACE_FUNC_EXIT; + } + +void CSconBtEngine::SetBtAuthorizedL( const TDesC& aBtDevAddress, TBool aAuthorized ) + { + TRACE_FUNC_ENTRY; + if ( iState != EIdle ) + { + User::Leave( KErrInUse ); + } + + TBTRegistrySearch crit; + TBTDevAddr addr; + addr.SetReadable( aBtDevAddress ); + crit.FindAddress( addr ); + + if ( !iBtDevArray ) + { + LOGGER_WRITE("create arr"); + iBtDevArray = new (ELeave) CBTDeviceArray(5); + LOGGER_WRITE("create arr -ok"); + } + else + { + iBtDevArray->ResetAndDestroy(); + } + TInt err = iBtEng->GetDevices( crit, iBtDevArray ); + LOGGER_WRITE_1("GetDevices err: %d", err); + User::LeaveIfError( err ); + iState = EChangeAuthorized; + iOperationError = KErrNone; + iAuthorizedValue = aAuthorized; + + // Wait until completed + iWait.Start(); + iState = EIdle; + if ( iOperationError ) + { + LOGGER_WRITE_1("Operation failed, leave %d", iOperationError); + User::Leave( iOperationError ); + + } + + TRACE_FUNC_EXIT; + } + +TInt CSconBtEngine::SetBtPowerState( TBool aPower ) + { + TRACE_FUNC_ENTRY; + if ( iState != EIdle ) + { + return KErrInUse; + } + + TBTPowerStateValue state; + iOperationError = iBtSettings->GetPowerState( state ); + if ( iOperationError ) + { + return iOperationError; + } + else if ( ( aPower && state == EBTPowerOn ) + || ( !aPower && state == EBTPowerOff ) ) + { + // No need to change state + return KErrNone; + } + + state = EBTPowerOff; + if ( aPower ) + { + state = EBTPowerOn; + } + iOperationError = iBtSettings->SetPowerState( state ); + if ( iOperationError ) + { + return iOperationError; + } + iState = EChangeBtState; + + // Wait until completed + iWait.Start(); + + iState = EIdle; + TRACE_FUNC_RET( iOperationError ); + return iOperationError; + } + +TInt CSconBtEngine::SetBtName( const TDesC& aBtName ) + { + LOGGER_WRITE_1("SetBtName aBtName: %S", &aBtName); + TInt err = iBtSettings->SetLocalName( static_cast( aBtName ) ); + TRACE_FUNC_RET( err ); + return err; + } + +// From MBTEngDevManObserver +void CSconBtEngine::HandleDevManComplete( TInt aErr ) + { + TRACE_FUNC; + LOGGER_WRITE_1("aErr: %d", aErr ); + if ( iState == EChangeAuthorized ) + { + if ( iWait.IsStarted() ) + { + iOperationError = aErr; + iWait.AsyncStop(); + } + } + + } + +void CSconBtEngine::HandleGetDevicesComplete( TInt aErr, + CBTDeviceArray* aDeviceArray ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aErr: %d", aErr); + //iBtReqOngoing = EFalse; + if ( iState == ERequestBtInfo ) + { + // Continue to write devices info + TRAP( iOperationError, PrintDevicesL() ); + LOGGER_WRITE_1("PrintDevicesL err: %d", iOperationError); + + if ( iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + else if ( iState == EChangeAuthorized ) + { + iOperationError = aErr; + if ( !aErr && aDeviceArray->Count() == 1 ) + { + CBTDevice* btRef = aDeviceArray->At(0); + TBTDeviceSecurity devSec = btRef->GlobalSecurity(); + if ( btRef->IsPaired() && !devSec.Banned() ) + { + LOGGER_WRITE8_1("btAdrr: %S", &btRef->BDAddr().Des() ); + CBTDevice* btDevice = CBTDevice::NewLC( btRef->BDAddr() ); + + btDevice->SetPaired( ETrue ); + + btDevice->SetDeviceNameL( btRef->DeviceName() ); + btDevice->SetFriendlyNameL( btRef->FriendlyName() ); + LOGGER_WRITE8_1("name: %S", &btRef->DeviceName()); + LOGGER_WRITE8_1("FriendlyName: %S", &btRef->FriendlyName()); + + LOGGER_WRITE_1("iAuthorizedValue: %d", iAuthorizedValue); + // Set as authorized and store the device + TBTDeviceSecurity security; + security.SetNoAuthenticate( EFalse ); + security.SetNoAuthorise( iAuthorizedValue ); + security.SetBanned( EFalse ); + + btDevice->SetGlobalSecurity (security ); + + //iOperationError = iBtEng->ModifyDevice(*aDeviceArray->At(0)); + iOperationError = iBtEng->ModifyDevice( *btDevice ); + LOGGER_WRITE_1( "ModifyDevice err: %d", iOperationError ); + CleanupStack::PopAndDestroy( btDevice ); + } + else + { + LOGGER_WRITE("Device was not paired or it's banned") + iOperationError = KErrAccessDenied; + } + } + + // If error occured stop waiting, otherwise continue waiting until + // HandleDevManComplete has been called + if ( iOperationError && iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + TRACE_FUNC_EXIT; + } + +void CSconBtEngine::PrintDevicesL() + { + TRACE_FUNC_ENTRY; + // calculate devices count + TInt devCount(0); + + for ( TInt i=0 ; iCount(); i++ ) + { + CBTDevice* device = iBtDevArray->At(i); + // show only paired and banned devices + if ( device->IsPaired() || device->GlobalSecurity().Banned() ) + { + devCount++; + } + } + + // Print info + iStream->WriteUint8L( devCount ); + + for ( TInt i=0 ; iCount(); i++ ) + { + CBTDevice* device = iBtDevArray->At(i); + + const TBTDeviceSecurity btSec = device->GlobalSecurity(); + + // show only paired and banned devices + if ( device->IsPaired() || btSec.Banned() ) + { + LOGGER_WRITE_1("IsValidDeviceName: %d", device->IsValidDeviceName()); + const TDesC8& deviceName = device->DeviceName(); + LOGGER_WRITE8_1("DeviceName: %S", &deviceName ); + iStream->WriteUint8L( deviceName.Length() ); + iStream->WriteL( deviceName, deviceName.Length() ); + + LOGGER_WRITE_1("IsValidFriendlyName: %d", device->IsValidFriendlyName()); + LOGGER_WRITE_1("FriendlyName: %S", &device->FriendlyName() ); + + const TBTDevAddr& addr = device->BDAddr(); + + TBuf<100> readable; + addr.GetReadable( readable ); + LOGGER_WRITE_1("readable addr: %S", &readable); + iStream->WriteUint8L( readable.Length() ); + iStream->WriteL( readable, readable.Length() ); + + LOGGER_WRITE_1("paired: %d", device->IsPaired() ); + LOGGER_WRITE_1("IsValidPaired: %d", device->IsValidPaired() ); + TUint8 paired(0); + if ( device->IsPaired() && device->IsValidPaired() ) + { + paired = 1; + } + iStream->WriteUint8L( paired ); + + TUint8 noAuthorise(0); + if ( btSec.NoAuthorise() ) + { + noAuthorise = 1; + } + iStream->WriteUint8L( noAuthorise ); + + TUint8 banned(0); + if ( btSec.Banned() ) + { + banned = 1; + } + iStream->WriteUint8L( banned ); + + LOGGER_WRITE(""); + } + } + iStream->CommitL(); + iStream = NULL; //delete reference only + TRACE_FUNC_EXIT; + } + +// From MBTEngSettingsObserver +void CSconBtEngine::PowerStateChanged( TBTPowerStateValue /*aState*/ ) + { + TRACE_FUNC; + if ( iState == EChangeBtState && iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + + } + +void CSconBtEngine::VisibilityModeChanged( TBTVisibilityMode /*aState*/ ) + { + TRACE_FUNC; + }