diff -r 0ba996a9b75d -r 613943a21004 bluetoothengine/btnotif/src/BTNInquiAO.cpp --- a/bluetoothengine/btnotif/src/BTNInquiAO.cpp Thu Aug 19 10:05:41 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,301 +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: Part of CBTInqUI class: use Active object to search BT devices. -* -*/ -#include "btninqui.h" -#include "btNotifDebug.h" - -/** Identification for active object request */ -const TInt KBTNotifInquiryNotifierReq = 20; - -// ---------------------------------------------------------- -// CBTInqUI::PrepareScannerL -// ---------------------------------------------------------- -// -void CBTInqUI::CreateScannerL() - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::CreateScannerL()")); - - __ASSERT_DEBUG( iScanner == NULL, User::Panic(_L("BTNotifInqUI - iScanner not released!"),KErrAlreadyExists)); - - // Create scanner object which will do the actual search - iScanner = CBTNotifActive::NewL( this, KBTNotifInquiryNotifierReq, CActive::EPriorityStandard ); - User::LeaveIfError( iSocketServer.Connect() ); - TProtocolDesc pInfo; - User::LeaveIfError( iSocketServer.FindProtocol( _L("BTLinkManager"), pInfo)); - User::LeaveIfError( iHostResolver.Open(iSocketServer, pInfo.iAddrFamily, pInfo.iProtocol)); - IssueRequestL(); - - FLOG(_L("[BTNOTIF]\t CBTInqUI::CreateScannerL() completed")); - } - -// ---------------------------------------------------------- -// CBTInqUI::IssueRequestL -// Issue Bluetooth device inquiry/search itself. -// Reads also inquiry mode from shared data. -// ---------------------------------------------------------- -// -void CBTInqUI::IssueRequestL() - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::IssueRequestL()")); - - if (reinterpret_cast(iDevSearchObserver)->AutoLockOnL()) - { - // Cancel bt inquiry immediately if device is locked. - FLOG(_L("[BTNOTIF]\t CBTInqUI::IssueRequestL() Device is locked")); - Cancel(); - return; - } - - TUint action = 0; - if( !iPageForName ) - { - action = KHostResInquiry + KHostResEir + KHostResIgnoreCache; - } - else - { - TInt firstPartialNameDevIndex; - if (HaveDevsWithPartialName(firstPartialNameDevIndex)) - { - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::IssueRequestL() looking up device index %d (have partial name already)"), firstPartialNameDevIndex)); - - action = KHostResName + KHostResIgnoreCache; - TInquirySockAddr sa; - sa.SetBTAddr(iLastSeenDevicesArray->At(firstPartialNameDevIndex)->BDAddr()); - iInquirySockAddr.SetBTAddr( sa.BTAddr() ); - } - else if( iCurrentlyResolvingUnnamedDeviceIndex < iDevsWithoutName.Count() ) - { - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::IssueRequestL() looking up device index %d (currently anonymous)"), iCurrentlyResolvingUnnamedDeviceIndex)); - - action = KHostResName + KHostResIgnoreCache; - TInquirySockAddr& sa = TInquirySockAddr::Cast( iDevsWithoutName[iCurrentlyResolvingUnnamedDeviceIndex].iAddr ); - iInquirySockAddr.SetBTAddr( sa.BTAddr() ); - } - } - if (action) - { - iInquirySockAddr.SetAction( action ); - iInquirySockAddr.SetIAC(KGIAC); - iHostResolver.GetByAddress( iInquirySockAddr, iEntry, iScanner->RequestStatus() ); - iScanner->GoActive(); - } - else - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::RunL() All name inquiries complete .")); - iPageForName = EFalse; - iCurrentlyResolvingUnnamedDeviceIndex = 0; - InquiryComplete( KErrNone ); - } - FLOG(_L("[BTNOTIF]\t CBTInqUI::IssueRequestL() completed")); - } - -// ---------------------------------------------------------- -// CBTInqUI::RequestCompletedL -// BT-device or timeout has been received. Inform caller for -// received device and issue next EIR/Name request. -// ---------------------------------------------------------- -// -void CBTInqUI::RequestCompletedL( CBTNotifActive* aActive, TInt aId, TInt aStatus ) - { - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::RequestCompletedL() status: %d >>"), aStatus )); - ASSERT( aId == KBTNotifInquiryNotifierReq); - (void) aActive; - - TInt firstPartialNameDevIndex = -1; - const TBool haveDevsWithPartialName = HaveDevsWithPartialName(firstPartialNameDevIndex); - - if( aStatus == KErrNone ) - { - if( iPageForName ) - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::RequestCompletedL() in name request state.")); - - if (haveDevsWithPartialName) - { - // We resolve names in chronological order so it must be the first device - // with an incomplete name we can find on the last seen list. - HandleUpdatedNameL(firstPartialNameDevIndex); - } - else - { - // Must be the current index in iDevsWithoutName. - HandleFoundNameL(); - iCurrentlyResolvingUnnamedDeviceIndex++; - } - IssueRequestL(); - } - else - { - HandleInquiryDeviceL(); - iHostResolver.Next( iEntry, iScanner->RequestStatus() ); - iScanner->GoActive(); - } - } - else if( aStatus == (KHCIErrorBase - EPageTimedOut) && iPageForName ) - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::RequestCompletedL() HCI:EPageTimeOut, page next one.")); - if (haveDevsWithPartialName) - { - // A device with incomplete name has probably gone out of range. Just removing - // it from the UI may be a bit confusing, so let's just update its RSSI indicator - // to minimum. - PageTimeoutOnDeviceWithPartialNameL(firstPartialNameDevIndex); - } - else - { - iCurrentlyResolvingUnnamedDeviceIndex++; - } - IssueRequestL(); - } - else - { - if( !iPageForName && (iDevsWithoutName.Count() > 0 || haveDevsWithPartialName) ) - { - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::RequestCompletedL() have devs with incomplete name = %d, nameless devices %d, paging for name."), - haveDevsWithPartialName, iDevsWithoutName.Count() )); - iCurrentlyResolvingUnnamedDeviceIndex = 0; - iPageForName = ETrue; - IssueRequestL(); - } - else - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::RequestCompletedL() NameInquiryComplete with error or no device found.")); - HandleError( aActive, aId, aStatus ); - } - } - FLOG(_L("[BTNOTIF]\t CBTInqUI::RequestCompletedL() <<")); - } - -// ---------------------------------------------------------- -// CBTInqUI::HandleError -// Inform UI from error occured. -// ---------------------------------------------------------- -// -void CBTInqUI::HandleError( CBTNotifActive* aActive, TInt aId, TInt aError ) - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::HandleError()")); - (void) aActive; - (void) aId; - iPageForName = EFalse; - InquiryComplete( aError ); - FLOG(_L("[BTNOTIF]\t CBTInqUI::HandleError() completed")); - } - -// ---------------------------------------------------------- -// CBTInqUI::DoCancelRequest -// ---------------------------------------------------------- -// -void CBTInqUI::DoCancelRequest( CBTNotifActive* aActive, TInt aId ) - { - (void) aActive; - (void) aId; - iHostResolver.Cancel(); - } - -// ---------------------------------------------------------- -// CBTInqUI::HandleInquiryDeviceL -// Inform of properties of the found BTdevice, -// which passes the search filter. Its name would be retrived -// later if not contained by the first round of inquiry. -// ---------------------------------------------------------- -// -void CBTInqUI::HandleInquiryDeviceL() - { - TInquirySockAddr& sa = TInquirySockAddr::Cast( iEntry().iAddr ); - - if ( iDesiredDeviceClass.DeviceClass() == 0 || sa.MajorClassOfDevice() == iDesiredDeviceClass.MajorDeviceClass() ) - { - FLOG(_L("[BTNOTIF]\t CBTInqUI::HandleInquiryDeviceL() The found device passes the search filter.")); -#ifdef _DEBUG - TBuf<12> devAddrString; - sa.BTAddr().GetReadable(devAddrString); - FTRACE(FPrint(_L("[BTNOTIF]\t BT Address: %S"), &devAddrString)); -#endif - TBTDeviceName devName; - TBool isNameComplete(EFalse); - TBool nameGotten = CheckEirDeviceName( iEntry, devName, isNameComplete ); - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleInquiryDeviceL() EIR device name? %d, %S, complete = %d"), nameGotten, &devName, isNameComplete )); - if( nameGotten ) - { - DeviceAvailableL( iEntry(), devName, isNameComplete ); - } - else - { - iDevsWithoutName.AppendL( iEntry() ); - } - } - } - -// ---------------------------------------------------------- -// CBTInqUI::HandleFoundNameL -// Inform of retrieved device name after 2nd inquiry. -// ---------------------------------------------------------- -// -void CBTInqUI::HandleFoundNameL() - { -#ifdef _DEBUG - TBuf<12> devAddrString; - TInquirySockAddr& sa = TInquirySockAddr::Cast( iEntry().iAddr ); - sa.BTAddr().GetReadable(devAddrString); - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleFoundNameL() BT Address: %S"), &devAddrString)); -#endif - if( iEntry().iName != KNullDesC ) - { - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleFoundNameL() Name found: %S"), &(iEntry().iName) )); - DeviceAvailableL( iDevsWithoutName[iCurrentlyResolvingUnnamedDeviceIndex], iEntry().iName, ETrue ); - } - - FLOG(_L("[BTNOTIF]\t CBTInqUI::HandleFoundNameL() Complete")); - } - -void CBTInqUI::HandleUpdatedNameL(TInt aLastSeenIndex) - { -#ifdef _DEBUG - TBuf<12> devAddrString; - TInquirySockAddr& sa = TInquirySockAddr::Cast( iEntry().iAddr ); - sa.BTAddr().GetReadable(devAddrString); - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleUpdatedNameL() BT Address: %S"), &devAddrString)); -#endif - iLastSeenDevicesNameComplete[aLastSeenIndex] = ETrue; - if( iEntry().iName != KNullDesC ) - { - DeviceNameUpdatedL(iEntry(), aLastSeenIndex); - } - - FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleUpdatedNameL() Complete"))); - } - - -// ---------------------------------------------------------- -// CBTInqUI::CheckEirDeviceName -// Check if the retrieved the device info contains device name. -// ---------------------------------------------------------- -// -TBool CBTInqUI::CheckEirDeviceName( TNameEntry& aEntry, TBTDeviceName& aName, TBool& aIsComplete ) - { - TBluetoothNameRecordWrapper eir( aEntry() ); - TInt length = eir.GetDeviceNameLength(); - - TInt err( KErrNone ); - - if( length > 0 ) - { - err = eir.GetDeviceName( aName, aIsComplete); - return (!err); - } - return EFalse; - } -// End of File