diff -r 86a2e675b80a -r 813b186005b6 hti/HtiCommPlugins/HtiBtCommPlugin/BtEngine/src/btservicesearcher.cpp --- a/hti/HtiCommPlugins/HtiBtCommPlugin/BtEngine/src/btservicesearcher.cpp Mon Jun 28 15:36:07 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,382 +0,0 @@ -/* -* 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: Bluetooth service searcher. -* -*/ - - -// INCLUDE FILES -#include "btservicesearcher.h" -#include "btservicesearcher.pan" - -#include "HtiBtEngineLogging.h" - -// ============================ MEMBER FUNCTIONS ============================== - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::CBTServiceSearcher() -// Constructor. -// ---------------------------------------------------------------------------- -// -CBTServiceSearcher::CBTServiceSearcher() -: iIsDeviceSelectorConnected( EFalse ) - { - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::~CBTServiceSearcher() -// Destructor. -// ---------------------------------------------------------------------------- -// -CBTServiceSearcher::~CBTServiceSearcher() - { - if ( iIsDeviceSelectorConnected ) - { - iDeviceSelector.CancelNotifier( KDeviceSelectionNotifierUid ); - iDeviceSelector.Close(); - } - delete iSdpSearchPattern; - iSdpSearchPattern = NULL; - - delete iAgent; - iAgent = NULL; - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::SelectDeviceByDiscoveryL() -// Select a device. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::SelectDeviceByDiscoveryL( - TRequestStatus& aObserverRequestStatus ) - { - if ( ! iIsDeviceSelectorConnected ) - { - User::LeaveIfError( iDeviceSelector.Connect() ); - iIsDeviceSelectorConnected = ETrue; - } - - iSelectionFilter().SetUUID( ServiceClass() ); - - iDeviceSelector.StartNotifierAndGetResponse( - aObserverRequestStatus, - KDeviceSelectionNotifierUid, - iSelectionFilter, - iResponse ); - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::SelectDeviceByNameL() -// Select a device by BT device name. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::SelectDeviceByNameL( const TDesC& aDeviceName, - TRequestStatus& aObserverRequestStatus ) - { - LOG_D( "CBTServiceSearcher::SelectDeviceByNameL" ); - - RSocketServ socketServ; - User::LeaveIfError( socketServ.Connect() ); - CleanupClosePushL( socketServ ); - - TProtocolDesc pInfo; - _LIT( KL2Cap, "BTLinkManager" ); - User::LeaveIfError( - socketServ.FindProtocol( TProtocolName( KL2Cap ), pInfo ) ); - - LOG_D( "CBTServiceSearcher: Found protocol" ); - - RHostResolver hr; - User::LeaveIfError( hr.Open( socketServ, - pInfo.iAddrFamily, pInfo.iProtocol ) ); - CleanupClosePushL( hr ); - - LOG_D( "CBTServiceSearcher: HostResolver open" ); - - TInquirySockAddr addr; - TNameEntry entry; - addr.SetIAC( KGIAC ); - addr.SetAction( KHostResName | KHostResInquiry ); - - User::LeaveIfError( hr.GetByAddress( addr, entry ) ); - LOG_D( "CBTServiceSearcher: GetByAddress ok" ); - TBool isFound = EFalse; - TInt err = KErrNone; - while ( !isFound && !err ) - { - if ( !aDeviceName.CompareF( entry().iName ) ) - { - LOG_D( "CBTServiceSearcher: Name match" ); - isFound = ETrue; - } - else - { - LOG_D( "CBTServiceSearcher: Not match - getting next" ); - err = hr.Next( entry ); - } - } - CleanupStack::PopAndDestroy( 2 ); // hr, socketServ - - iStatusObserver = &aObserverRequestStatus; - - if ( isFound ) - { - TInquirySockAddr& sa = TInquirySockAddr::Cast( entry().iAddr ); - iResponse().SetDeviceAddress( sa.BTAddr() ); - iResponse().SetDeviceName( entry().iName ); - TBTDeviceClass deviceClass( sa.MajorServiceClass(), - sa.MajorClassOfDevice(), - sa.MinorClassOfDevice() ); - iResponse().SetDeviceClass( deviceClass ); - User::RequestComplete( iStatusObserver, KErrNone ); - } - - else - { - LOG_E( "CBTServiceSearcher: Device not found! Can't connect!" ); - User::RequestComplete( iStatusObserver, err ); - } - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::FindServiceL() -// Find a service on the specified device. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::FindServiceL( const TBTDevAddr& aDeviceAddress, - TRequestStatus& aObserverRequestStatus ) - { - iResponse().SetDeviceAddress( aDeviceAddress ); - if ( !iResponse().IsValidBDAddr() ) - { - User::Leave( KErrArgument ); - } - iHasFoundService = EFalse; - - // delete any existing agent and search pattern - delete iSdpSearchPattern; - iSdpSearchPattern = NULL; - - delete iAgent; - iAgent = NULL; - - iAgent = CSdpAgent::NewL(*this, BTDevAddr()); - - iSdpSearchPattern = CSdpSearchPattern::NewL(); - - iSdpSearchPattern->AddL( ServiceClass() ); - // return code is the position in the list that the UUID is inserted at - // and is intentionally ignored - - iAgent->SetRecordFilterL( *iSdpSearchPattern ); - - iStatusObserver = &aObserverRequestStatus; - - iAgent->NextRecordRequestL(); - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::NextRecordRequestComplete() -// Process the result of the next record request. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::NextRecordRequestComplete( - TInt aError, - TSdpServRecordHandle aHandle, - TInt aTotalRecordsCount) - { - TRAPD( error, - NextRecordRequestCompleteL( aError, aHandle, aTotalRecordsCount ); - ); - - if ( error != KErrNone ) - { - Panic( EBTServiceSearcherNextRecordRequestComplete ); - } - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::NextRecordRequestCompleteL() -// Process the result of the next record request. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::NextRecordRequestCompleteL( - TInt aError, - TSdpServRecordHandle aHandle, - TInt aTotalRecordsCount ) - { - if ( aError == KErrEof ) - { - Finished(); - return; - } - - if ( aError != KErrNone ) - { - LOGFMT_E("CBTServiceSearcher: NextRecordRequestCompleteL: %d", aError ); - Finished( aError ); - return; - } - - if ( aTotalRecordsCount == 0 ) - { - LOG_I("CBTServiceSearcher: NextRecordRequestCompleteL: No records found"); - Finished( KErrNotFound ); - return; - } - - // Request its attributes - iAgent->AttributeRequestL( aHandle, KSdpAttrIdProtocolDescriptorList ); - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::AttributeRequestResult() -// Process the next attribute requested. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::AttributeRequestResult( - TSdpServRecordHandle aHandle, - TSdpAttributeID aAttrID, - CSdpAttrValue* aAttrValue ) - { - TRAPD( error, - AttributeRequestResultL( aHandle, aAttrID, aAttrValue ); - ); - if ( error != KErrNone ) - { - Panic( EBTServiceSearcherAttributeRequestResult ); - } - - // Delete obsolete local atribute pointer. - delete aAttrValue; - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::AttributeRequestResultL() -// Process the next attribute requested. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::AttributeRequestResultL( - TSdpServRecordHandle /*aHandle*/, - TSdpAttributeID aAttrID, - CSdpAttrValue* aAttrValue ) - { - __ASSERT_ALWAYS( aAttrID == KSdpAttrIdProtocolDescriptorList, - User::Leave( KErrNotFound ) ); - - TSdpAttributeParser parser( ProtocolList(), *this ); - - // Validate the attribute value, and extract the RFCOMM channel - aAttrValue->AcceptVisitorL( parser ); - - if ( parser.HasFinished() ) - { - // Found a suitable record so change state - iHasFoundService = ETrue; - } - } - -// ----------------------------------------------------------------------------- -// CBTServiceSearcher::AttributeRequestComplete() -// Process the attribute request completion. -// ----------------------------------------------------------------------------- -// -void CBTServiceSearcher::AttributeRequestComplete( TSdpServRecordHandle aHandle, - TInt aError ) - { - TRAPD( error, - AttributeRequestCompleteL( aHandle, aError ); - ); - if ( error != KErrNone ) - { - Panic( EBTServiceSearcherAttributeRequestComplete ); - } - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::AttributeRequestCompleteL() -// Process the attribute request completion. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::AttributeRequestCompleteL( TSdpServRecordHandle - /*aHandle*/, - TInt aError ) - { - if ( aError != KErrNone ) - { - LOGFMT_W("CBTServiceSearcher::AttributeRequestCompleteL: %d", aError); - } - else - { - // done with attributes of this service record, request next - iAgent->NextRecordRequestL(); - } - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::Finished() -// The search has finished and notify the observer -// that the process is complete. -// ---------------------------------------------------------------------------- -// -void CBTServiceSearcher::Finished( TInt aError /* default = KErrNone */ ) - { - if ( aError == KErrNone && !HasFoundService() ) - { - aError = KErrNotFound; - } - User::RequestComplete( iStatusObserver, aError ); - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::HasFinishedSearching() -// Is the instance still wanting to search. -// ---------------------------------------------------------------------------- -// -TBool CBTServiceSearcher::HasFinishedSearching() const - { - return EFalse; - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::BTDevAddr() -// Returns the bluetooth device address. -// ---------------------------------------------------------------------------- -// -const TBTDevAddr& CBTServiceSearcher::BTDevAddr() - { - return iResponse().BDAddr(); - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::ResponseParams() -// Returns information about the device selected by the user. -// ---------------------------------------------------------------------------- -// -const TBTDeviceResponseParams& CBTServiceSearcher::ResponseParams() - { - return iResponse(); - } - -// ---------------------------------------------------------------------------- -// CBTServiceSearcher::HasFoundService() -// True if a service has been found. -// ---------------------------------------------------------------------------- -// -TBool CBTServiceSearcher::HasFoundService() const - { - return iHasFoundService; - } - -// End of File