commands/btservices/BtServicesEng.h
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/btservices/BtServicesEng.h	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,195 @@
+// BtServicesEng.h
+// 
+// Copyright (c) 2003 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#ifndef BTSERVICESENG_H_
+#define BTSERVICESENG_H_
+
+#include <btsdp.h>
+#include <es_sock.h>
+#include <bt_sock.h>
+#include <barsread.h>
+
+#include "btserviceview.h"
+//#include <QikListBoxModel.h>
+
+enum TBtPanicCode
+	{
+	EBtEngineNotCreated = 1,
+	EBtEngineAlreadyExists = 2,
+	EBtIndentationZeroInStartList = 3,
+	EBtIndentationZeroInLineFinished = 4
+	};
+
+class CBtAttributeBuilder;
+
+class CServiceRecordItem
+	{
+public:
+	CServiceRecordItem()
+	{
+	iHandle = 0;
+	iServiceName = _L("");
+	}
+	
+	~CServiceRecordItem(){;}
+	
+	TSdpServRecordHandle iHandle;
+	TBuf<64> iServiceName;
+	
+	};
+
+/**
+This provides the main application functionality, specifically
+setting up the SDP agent and implementing the notifier interface
+to build the results into an array, displayed by the main View
+(CBtServicesListView) in the case of services, or by the attribute
+dialog in the case of attributes for a selected service.
+*/
+class CBtServicesEng : public CBase, public MSdpAgentNotifier  
+	{
+public:
+	static CBtServicesEng* NewL();
+	~CBtServicesEng();
+	void SetView(CBtServiceView* apView);
+	//CDesCArrayFlat* GetTextArray() const;
+
+	// defined in MSdpAgentNotifier
+	void AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError);
+	void AttributeRequestResult(TSdpServRecordHandle aHandle, TSdpAttributeID aAttrID, CSdpAttrValue* aAttrValue);
+	void NextRecordRequestComplete(TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount);
+
+	/////////////////////////////////////////////////////////
+	void ReportMessage(TInt aVerboseLevel, TRefByValue<const TDesC> aFmt, ...);
+	
+	void MakeTextServiceList();
+	void MakeTextUUIDList();
+	
+	TInt BluetoothReady();
+	void NewDeviceSelectedL(const TBTDevAddr& aAddress,const TBTDeviceName& aDeviceName);
+	void GetDeviceServicesL();
+
+	void GetAttributesL(TInt aIndex);
+	void GetDeviceAttributesL(const TBTDevAddr& aAddress,const TBTDeviceName& aDeviceName, TSdpServRecordHandle aHandle);
+	
+	TBool GettingAllAttributes() const;
+	void AddAttributeLineL(const TDesC& aDes);
+	void SetUUIDFilterL(TUint32 aUUID);
+	void DisplayDeviceInfoL();
+	void DisplayLocalInfoL();
+	void CancelSdpAgent();
+	void DeleteSdpAgent();
+	void AppendUUIDText(TDes& aBuf, TUUID aUUID) const;
+	
+	static void Panic(TBtPanicCode aPanicCode);
+	static TPtrC UUIDToString(TUint32 aUuidValue);
+	static TBool StringToUUID(TDesC& aString, TUint32& aUuidValue);	
+private:
+	CBtServicesEng();
+	void ConstructL();
+	void GetServiceNamesL();
+	void SdpCompletedWithError(const TInt aError);
+	void AppendErrorMessage(const TInt aError, TDes& aBuf) const;
+	void DoAttributeRequestCompleteL();
+	void DoAttributeRequestResultL(CSdpAttrValue* aAttrValue, TSdpServRecordHandle aHandle);
+	void DoNextRecordRequestCompleteL(TSdpServRecordHandle aHandle, TInt aError);
+	void ReleaseModel();
+
+private:
+	// Values of iCurrentAttributeRequest
+	enum TAttributeRequests
+		{
+		ENoOutstandingRequests,
+		EGettingNamesOnly,
+		EGettingAllAttributes
+		};
+
+	CSdpAgent* iSdpAgent;
+	CSdpSearchPattern* iSearchPattern;
+	//CDesCArrayFlat* iTextArray;
+	CDesCArrayFlat* iAttributeArray;
+	RPointerArray <CServiceRecordItem> iRecordArray;
+	CSdpAttrIdMatchList* iAttributeMatchList;
+	CBtAttributeBuilder* iAttributeBuilder;
+
+	CBtServiceView* iView; // iView is not "owned" by this
+	//CEikonEnv* iEikon;
+	
+	TInt iHandleCounter;
+	TAttributeRequests iCurrentAttributeRequest;
+	TBTDeviceName iDeviceName;	//this is taken from the caller and only be used to display
+	TBTDevAddr iDeviceAddress;	//critical for SDP
+	
+	//TBTDeviceClass iDeviceClass;//this is taken from the caller and only be used to display
+	
+	TPtrC iServiceName;
+	TUint32 iUUIDFilter;
+
+	RArray<TUUID> iUUIDs;
+	RPointerArray<HBufC> iUUIDsAsText;
+	RArray<TInt> iErrorCodes;
+	RPointerArray<HBufC> iErrorMessages;
+
+	RSocketServ iSocketServ;
+	
+	TBuf<512> iTextBuf;
+	};
+
+/**
+Receives and parses the results from an SDP Attribute Request, and builds
+them into a table (array for listbox) for displaying in
+the attributes dialog.
+*/
+class CBtAttributeBuilder : public CBase, public MSdpElementBuilder
+	{
+public:
+	static CBtAttributeBuilder* NewL(CBtServicesEng& aEngine);
+	void SetHandle(TSdpServRecordHandle aHandle);
+	void Reset();
+	~CBtAttributeBuilder();
+private:
+	// defined in MSdpElementBuilder
+	MSdpElementBuilder* BuildUnknownL(TUint8 aType, TUint8 aSizeDesc, const TDesC8& aData);
+	MSdpElementBuilder* BuildNilL();
+	MSdpElementBuilder* BuildUintL(const TDesC8& aUint);
+	MSdpElementBuilder* BuildIntL(const TDesC8& aInt);
+	MSdpElementBuilder* BuildUUIDL(const TUUID& aUUID);
+	MSdpElementBuilder* BuildBooleanL(TBool aBool);
+	MSdpElementBuilder* BuildStringL(const TDesC8& aString);
+	MSdpElementBuilder* BuildDESL();  // Must not return NULL
+	MSdpElementBuilder* BuildDEAL();  // ditto
+	MSdpElementBuilder* StartListL(); // ditto
+	MSdpElementBuilder* EndListL();
+	MSdpElementBuilder* BuildURLL(const TDesC8& aURL);
+
+private:
+	CBtAttributeBuilder(CBtServicesEng& aEngine);
+	void AppendAttrMnemonic(TDes& aBuf, TUint aAttrID) const;
+	void LineFinishedL();
+	void ConstructL();
+private:
+	enum TCurrentStatus {
+		EExpectingAttrID,
+		EExpectingAttrValue
+		};
+
+	RArray<TUint> iAttrIDs;
+	RPointerArray<HBufC> iAttrMnemonics;
+
+	CBtServicesEng& iEngine;
+	TBuf<KMaxDescriptorLength> iCurrentLine;
+	TInt iIndentation;
+	TCurrentStatus iStatus;
+	TSdpServRecordHandle iHandle;
+	};
+
+
+#endif