www.pudn.com > Example_BluetoothChat.rar > BluetoothAdvertiser.cpp


/** 
* 
* @brief Definition of CBluetoothAdvertiser 
* 
* Copyright (c) EMCC Software Ltd 2003 
* @version 1.0 
*/ 
 
#include  
#include "BluetoothAdvertiser.h" 
#include "BluetoothDefinitions.h" 
 
 
// Constants 
const TUint KStateFullyUnused = 0xFF; 
const TUint KStateFullyUsed   = 0x00; 
 
/** 
* Constructor. 
* Private constructor. 
* @see NewL 
* @see NewLC 
* @param none 
* @return none 
**/ 
CBluetoothAdvertiser::CBluetoothAdvertiser() 
: iRecord(0), 
  iIsConnected(EFalse) 
	{ 
	} 
 
/** 
* Destructor. 
* Stop Advertising and cleanup sessions to Service Discovery Database 
* @param none 
* @return none 
**/ 
CBluetoothAdvertiser::~CBluetoothAdvertiser() 
	{ 
	if (IsAdvertising()) 
		{ 
		TRAPD(err,StopAdvertisingL()); 
		} 
 
	iSdpDatabase.Close(); 
	iSdpSession.Close(); 
	} 
 
/** 
* Factory Constructor. 
* Only available way to construct class. 
* This function can leave L 
* @param none 
* @return new instance of the CBluetoothAdvertiser 
*/ 
CBluetoothAdvertiser* CBluetoothAdvertiser::NewL() 
	{ 
	CBluetoothAdvertiser* self = CBluetoothAdvertiser::NewLC(); 
	CleanupStack::Pop(self); 
	return self; 
	} 
/** 
* Factory Constructor. 
* Only available way to construct class. 
* This function can leave L. 
* @param none 
* @return new instance of the CBluetoothAdvertiser, this is also left on the cleanup stack C 
*/ 
CBluetoothAdvertiser* CBluetoothAdvertiser::NewLC() 
	{ 
	CBluetoothAdvertiser* self = new (ELeave) CBluetoothAdvertiser(); 
	CleanupStack::PushL(self); 
	self->ConstructL(); 
	return self; 
	} 
 
/** 
* Second Stage Constructor. 
* This function can leave L 
* @param none 
* @see NewL 
* @see NewLC 
* @param none 
* @return none 
*/ 
void CBluetoothAdvertiser::ConstructL() 
	{ 
	} 
 
/** 
* Connect Method 
* If not presently connected open a session on the Service Discovery Database 
**/ 
void CBluetoothAdvertiser::ConnectL() 
	{ 
	if (!iIsConnected) 
		{ 
		User::LeaveIfError(iSdpSession.Connect()); 
		User::LeaveIfError(iSdpDatabase.Open(iSdpSession)); 
		iIsConnected = ETrue; 
		} 
	} 
 
/** 
* Start Advertising. 
* Create Service Record, add attributes, and enter into the Service Discovery Database 
* @param aPort the port number to advertise 
* @return none 
**/ 
void CBluetoothAdvertiser::StartAdvertisingL(TInt aPort) 
	{ 
	if (IsAdvertising()) 
		{ 
		// could be advertising on a different port 
		StopAdvertisingL(); 
		} 
	if (! iIsConnected) 
		{ 
		ConnectL(); 
		} 
 
	iSdpDatabase.CreateServiceRecordL(KServiceClass, iRecord); 
 
	// add a Protocol to the record 
	CSdpAttrValueDES* vProtocolDescriptor = CSdpAttrValueDES::NewDESL(NULL); 
	CleanupStack::PushL(vProtocolDescriptor); 
 
	BuildProtocolDescriptionL(vProtocolDescriptor,aPort); 
 
	iSdpDatabase.UpdateAttributeL(iRecord, KSdpAttrIdProtocolDescriptorList, *vProtocolDescriptor); 
 
	CleanupStack::PopAndDestroy(vProtocolDescriptor); 
 
	// Add a name to the record 
	iSdpDatabase.UpdateAttributeL(iRecord, 
								  KSdpAttrIdBasePrimaryLanguage+KSdpAttrIdOffsetServiceName, 
								  KServiceName); 
 
	// Add a description to the record 
	iSdpDatabase.UpdateAttributeL(iRecord, 
								  KSdpAttrIdBasePrimaryLanguage+KSdpAttrIdOffsetServiceDescription, 
								  KServiceDescription); 
	} 
 
/** 
* Update Availability. 
* Toggle function for the availability of Bluetooth Service 
* @param aIsAvailable a boolean representing the availablity of the service 
* @return none 
**/ 
void CBluetoothAdvertiser::UpdateAvailabilityL(TBool aIsAvailable) 
	{ 
	TUint state; 
	if (aIsAvailable) 
		{ 
		state = KStateFullyUnused; 
		} 
	else 
		{ 
		state = KStateFullyUsed;	// Fully used -> can't connect 
		} 
 
	// Update the availibility attribute field 
	iSdpDatabase.UpdateAttributeL(iRecord, KSdpAttrIdServiceAvailability, state); 
 
	// Mark the record as changed - by increasing its state number (version) 
	iSdpDatabase.UpdateAttributeL(iRecord, KSdpAttrIdServiceRecordState, ++iRecordState); 
	} 
 
/** 
* Stop Advertising. 
* Used when a connection is made (to avoid multiple connections) or when closing down advertiser 
* @param none 
* @return none 
**/ 
void CBluetoothAdvertiser::StopAdvertisingL() 
	{ 
	if (IsAdvertising()) 
		{ 
		iSdpDatabase.DeleteRecordL(iRecord); 
		iRecord = 0; 
		} 
	} 
 
 
/** 
* Build Protocol Description. 
* Builds the Data Element Sequence for the KSdpAttrIdProtocolDescriptorList attribute of Bluetooth Service record 
* @param aProtocolDescriptor a pointer to the protocol descriptor to be populated with data 
* @param aPort the port number to advertise 
* @return none 
**/ 
void CBluetoothAdvertiser::BuildProtocolDescriptionL(CSdpAttrValueDES* aProtocolDescriptor, TInt aPort) 
	{ 
	TBuf8<1> channel; 
	channel.Append((TChar)aPort); 
 
	aProtocolDescriptor 
	->StartListL()	// List of protocols required for this method 
		->BuildDESL() 
		->StartListL()	// Details of lowest level protocol 
			->BuildUUIDL(KL2CAP) 
		->EndListL() 
 
		->BuildDESL() 
		->StartListL() 
			->BuildUUIDL(KRFCOMM) 
			->BuildUintL(channel) 
		->EndListL() 
	->EndListL(); 
	}