⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bluetoothserviceadvertiser.cpp

📁 roids60 game symbian os application development
💻 CPP
字号:
/*============================================================================ Name			: BlueToothServiceAdvertiser.cpp Author	  		:  Copyright   	: Description 	: Implemetation============================================================================*/// INCLUDE FILES#include "BluetoothServiceAdvertiser.h"#include "common.hrh"_LIT(KRpsServiceName, "RPS");_LIT(KRpsServiceDes, "RPS");const TInt KPortBufMaxSize = 2;const TInt KServAvailBufMaxSize = 1;/*============================================================================CBluetoothServiceAdvertiser's constructor============================================================================*/CBluetoothServiceAdvertiser::CBluetoothServiceAdvertiser(MBluetoothServiceAdvertiserObserver& aSerAdvObs)	:CActive(CActive::EPriorityStandard), iSerAdvObs(aSerAdvObs), iState(EIdle)	{	CActiveScheduler::Add(this);	}/*============================================================================CBluetoothServiceAdvertiser's destructor============================================================================*/CBluetoothServiceAdvertiser::~CBluetoothServiceAdvertiser()	{	Cancel();	UnregisterService();	}/*============================================================================Entry point of the CBluetoothServiceAdvertiser's state machine. The initial state must be EIdle.A state other than EIdle will result in a KErrInUse. This is to prevent StartL() callingmore than once if the state machine is alread active.============================================================================*/void CBluetoothServiceAdvertiser::StartL(const TInt aPort)	{	if (iState != EIdle)		{		User::Leave(KErrInUse);		}			iPort = aPort;	SelfComplete();	}/*============================================================================Connect to the SDP server and open a SDP's  RSdpDatabase subsession where service records and their attributes can be added, deleted, and updated.============================================================================*/void CBluetoothServiceAdvertiser::ConnectToSdpL()	{	iState = EConnecting;	User::LeaveIfError(iSdpServ.Connect());	User::LeaveIfError(iSdpDatabase.Open(iSdpServ));	SelfComplete();	}	/*============================================================================Create and add the RPS's service record into the SDP's database============================================================================*/void CBluetoothServiceAdvertiser::BuildServiceRecordL()	{	iState = EBuildingServiceRecord;	TUUID serviceUUID(KRPS_BTServiceID);	//Creates a new service record, with a single service class (KRPS_BTServiceID) in the SDP database.	//If succesful iRecordHandle will hold the RPS's record handle.	iSdpDatabase.CreateServiceRecordL(serviceUUID, iRecordHandle);	//Now the RPS's record needs to be filled with RPS's service attributes		// Add the RFCOMM protocol attribute to the record.	CSdpAttrValueDES* protocolDescriptorList = CSdpAttrValueDES::NewDESL(NULL);	CleanupStack::PushL(protocolDescriptorList);    TBuf8<KPortBufMaxSize> port;     port.Append((TChar)iPort);        //Builds a protocol list of attributes. In our example the list contains only the RFCOMM protocol element    //and the RFCOMM's port. For more information about the structure of a SDP's record please refer to the SDK	protocolDescriptorList	->StartListL()					//Marks the start of the list	    ->BuildDESL()				//Adds a Data Element Sequence (DES) 		->StartListL()				//Indicates that subsequent elements added belong to a DES (Data Element Sequence) or DEA (Data Element Alternative)			->BuildUUIDL(KRFCOMM)	//Adds the RFCOMM's TUUID	        ->BuildUintL(port)		//Adds the RFCOMM's port. Remote devices will connect to this port to use the RPS's service		->EndListL()				//Marks the end of the subsequent element	->EndListL();					//Marks the end of the list	//Sets the protocol list to the record	iSdpDatabase.UpdateAttributeL(iRecordHandle, KSdpAttrIdProtocolDescriptorList, *protocolDescriptorList);	CleanupStack::PopAndDestroy(protocolDescriptorList);	//Adds the record's name attribute	iSdpDatabase.UpdateAttributeL(iRecordHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, KRpsServiceName);	//Adds the record's description attribute	iSdpDatabase.UpdateAttributeL(iRecordHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, KRpsServiceDes);	//Adds the record's available service attribute	CSdpAttrValue* attrVal = NULL;	TBuf8<KServAvailBufMaxSize> avail;	avail.FillZ(1);	avail[0]=0xff;//Fully available value	//Service availability is store as a TUint 	attrVal = CSdpAttrValueUint::NewUintL(avail);	CleanupStack::PushL(attrVal);	iSdpDatabase.UpdateAttributeL(iRecordHandle, KSdpAttrIdServiceAvailability, *attrVal);	CleanupStack::PopAndDestroy(attrVal);	SelfComplete();	}	/*============================================================================Removes the RPS's service record from the SDP's database============================================================================*/void CBluetoothServiceAdvertiser::UnregisterService()	{	// Deletes SDP Record    if (iRecordHandle)		{        TRAPD(ret,iSdpDatabase.DeleteRecordL(iRecordHandle));		}    // Closes SDP's database handle    iSdpDatabase.Close();    // Close SDP's session    iSdpServ.Close();	}	/*============================================================================Handles the active object's service advertising completion events.============================================================================*/void CBluetoothServiceAdvertiser::RunL()	{	switch (iState)        {        case EIdle:        	//State machine entry point        	ConnectToSdpL();        	break;        case EConnecting:        	//Connect to SDP server completed, start building the RPS's service record        	BuildServiceRecordL();            break;          case EBuildingServiceRecord:        	//Build RPS's service record completed, notify the completion event to the observer.        	iSerAdvObs.AdvertiserComplete();            break;           default:            User::Leave(KErrCorrupt);            break;        };		}/*============================================================================DoCancel is called as part of the active object's Cancel().============================================================================*/void CBluetoothServiceAdvertiser::DoCancel()	{	//Not Used	}/*============================================================================Calls User::RequestComplete on this active object. Used to trigger the next step of the state machine.============================================================================*/void CBluetoothServiceAdvertiser::SelfComplete()	{	TRequestStatus* status = &iStatus;	User::RequestComplete(status, KErrNone);	SetActive();			}/*============================================================================Handles a leave occurring in the request completion event handler RunL().Close all resources, reset the state machine to the EIdle state, notify theobserver of the error============================================================================*/TInt CBluetoothServiceAdvertiser::RunError(TInt aError)	{	switch (iState)        {        case EConnecting:            break;        case EBuildingServiceRecord:		    // Delete SDP Record		    if (iRecordHandle)				{		        TRAPD(err,iSdpDatabase.DeleteRecordL(iRecordHandle));				}		    // Close SDP handles		    iSdpDatabase.Close();		    iSdpServ.Close();            break;           default:        	aError = KErrCorrupt;            break;        };        		iState = EIdle;	iSerAdvObs.ReportAdvertiserErr(aError);	return KErrNone;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -