www.pudn.com > Bluetooth_PMP_Example_v1_0.zip > DeviceDiscoverer.cpp


/* 
* ============================================================================ 
*  Name     : CDeviceDiscoverer from DeviceDiscoverer.h 
*  Part of  : BluetoothPMPExample 
*  Created  : 14.01.2004 by Forum Nokia 
*  Implementation notes: 
*     Initial content was generated by Series 60 AppWizard. 
*  Version  : 
*  Copyright: Nokia Corporation 
* ============================================================================ 
*/ 
 
// INCLUDE FILES 
#include "DeviceDiscoverer.h" 
 
 
CDeviceDiscoverer* CDeviceDiscoverer::NewL(RSocketServ *aSocketServ, 
										   MDeviceDiscoObserver *aObserver) 
	{ 
	CDeviceDiscoverer* self = CDeviceDiscoverer::NewLC(aSocketServ, aObserver); 
    CleanupStack::Pop(self); 
	return self; 
	} 
 
 
CDeviceDiscoverer* CDeviceDiscoverer::NewLC(RSocketServ *aSocketServ, 
											MDeviceDiscoObserver *aObserver) 
	{ 
	CDeviceDiscoverer* self = new (ELeave) CDeviceDiscoverer(aSocketServ, 
		aObserver); 
	CleanupStack::PushL(self); 
	self->ConstructL(); 
	return self; 
	} 
 
 
void CDeviceDiscoverer::ConstructL() 
	{ 
	} 
 
 
// ---------------------------------------------------------------------------- 
// CDeviceDiscoverer::CDeviceDiscoverer(RSocketServ *aSocketServ, 
//										MDeviceDiscoObserver *aObserver) 
// 
// constructor 
// ---------------------------------------------------------------------------- 
CDeviceDiscoverer::CDeviceDiscoverer(RSocketServ *aSocketServ, 
									 MDeviceDiscoObserver *aObserver): 
	CActive(CActive::EPriorityStandard), 
	iSocketServ(aSocketServ), 
	iDiscoveredDeviceCount(0), 
	iObserver(aObserver) 
	{ 
	CActiveScheduler::Add(this); 
	} 
 
 
// ---------------------------------------------------------------------------- 
// CDeviceDiscoverer::~CDeviceDiscoverer() 
// 
// destructor 
// ---------------------------------------------------------------------------- 
CDeviceDiscoverer::~CDeviceDiscoverer() 
	{  
	// cancel active object 
	Cancel(); 
	} 
 
 
// ---------------------------------------------------------------------------- 
// CDeviceDiscoverer::DiscoverDevicesL(TDeviceDataList *aDevDataList) 
// 
// discover remote devices.  RHostResolver will be used to do the discovery. 
// any found devices will be placed in aDevDataList. 
// ---------------------------------------------------------------------------- 
void CDeviceDiscoverer::DiscoverDevicesL(TDeviceDataList *aDevDataList) 
	{ 
 
	iDiscoveredDeviceCount=0; 
	// wipe existing device data list, start fresh 
	iDevDataList=aDevDataList; 
	iDevDataList->Reset(); 
 
	// load protocol for discovery 
	TProtocolDesc pdesc; 
	User::LeaveIfError(iSocketServ->FindProtocol(_L("BTLinkManager"), pdesc)); 
 
	// initialize host resolver 
	User::LeaveIfError(iResolver.Open(*iSocketServ, pdesc.iAddrFamily, pdesc.iProtocol)); 
 
	// start device discovery by invoking remote address lookup 
	iAddr.SetIAC(KGIAC); 
	iAddr.SetAction(KHostResInquiry|KHostResName|KHostResIgnoreCache); 
	iResolver.GetByAddress(iAddr, iEntry, iStatus); 
	SetActive(); 
 
	} 
 
 
void CDeviceDiscoverer::RunL() 
	{ 
	// RHostResolver.GetByAddress(..) has completed, process results 
	if ( iStatus!=KErrNone ) 
		{ 
		// all devices (if any) done, notify  
		iObserver->HandleDeviceDiscoveryCompleteL(); 
		} 
	else  
		{ 
 
		// new device data entry 
		TDeviceData *devData = new (ELeave) TDeviceData(); 
		devData->iDeviceName = iEntry().iName; 
		devData->iDeviceAddr =  
			static_cast(iEntry().iAddr).BTAddr(); 
		devData->iDeviceServicePort = 0; 
		// add device data entry 
		iDevDataList->Append(devData); 
 
		iDiscoveredDeviceCount++; 
 
		// get next discovered device 
		iResolver.Next(iEntry, iStatus); 
		// wait for resolver to complete 
		SetActive(); 
 
		} 
	} 
 
 
void CDeviceDiscoverer::DoCancel() 
	{ 
	// cancel and close resolver 
	iResolver.Close(); 
	} 
 
 
// ---------------------------------------------------------------------------- 
// CDeviceDiscoverer::HasDevices() 
// 
// returns true if any devices were discovered 
// ---------------------------------------------------------------------------- 
TBool CDeviceDiscoverer::HasDevices() 
	{ 
	return ( iDiscoveredDeviceCount>0 ); 
	}