bluetooth/btsdp/server/epocsvr.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btsdp/server/epocsvr.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,274 @@
+// Copyright (c) 1999-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:
+//
+
+
+#ifndef EPOCSVR_H
+#define EPOCSVR_H
+
+#include <e32base.h>
+#include <btdevice.h>
+#include <bluetooth/eirpublisher.h>
+#include "SDPDatabase.h"
+
+class CSdpServSession;
+class CSdpDatabaseSubSession;
+class CSdpUuidManager;
+
+/**
+SDP Server Shutdown Timer.
+Closes the SDP server after a preset delay. Activated before the first client connects
+and after the last client disconnects.
+**/
+NONSHARABLE_CLASS(CSdpServerShutdown) : public CTimer
+	{
+	enum {KSdpServerShutdownDelay=5000000};	// approx 5s
+public:
+	inline CSdpServerShutdown();
+	inline void ConstructL();
+	inline void Start();
+private:
+	void RunL();
+	};
+
+_LIT(KSdpServerPanic,"SdpServInternal");
+enum TSdpServerPanic
+	{
+	ESdpStoredAttrValNotEncoded = 0,
+	ESdpAttributeEncodingFailed = 1,
+	ESdpBadState = 2,
+	ESdpReadAlreadyOutstanding = 3,
+	ESdpOutstandingOperation = 4,
+	};
+
+void PanicServer(TSdpServerPanic aPanic);
+void PanicClient(const RMessage2& aMessage, TSdpClientPanic aPanic);
+
+/**
+   The EPOC SDP Server.
+   This is the start of the EPOC client/server
+   class hierarchy
+**/
+NONSHARABLE_CLASS(CSdpServer) : public CPolicyServer
+	{
+public:
+	//construct / destruct
+	static CSdpServer* NewLC();
+	CSdpDatabase* Database();
+	void BuildRecordZeroL();
+	~CSdpServer();
+
+	void AddSession();
+	void DropSession();
+
+	inline CSdpListener& Listener() const;
+
+	TInt RunError(TInt aError);
+	
+	//database operations
+	CSdpServRecord* CreateServiceRecordL(const RMessage2& aMessage);
+	CSdpServRecord* FindAndCheckServiceRecordForDeletion(const RMessage2& aMessage);
+	void UpdateAttributeL(const RMessage2& aMessage);
+	void DeleteAttribute(const RMessage2& aMessage);
+	void DeleteServiceRecord(CSdpServRecord* aServiceRecord);
+	
+private:
+	CSdpServer();
+	void ConstructL();
+	//open/close a session
+	CSession2* NewSessionL(const TVersion &aVersion) const;
+	CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const;
+
+	void CheckAllowedL(const RMessage2& aMessage, const CSdpServRecord& aRecord);
+	TBool Allowed(const RMessage2& aMessage, const CSdpServRecord& aRecord);
+	
+	CSdpServRecord* FindRecordByHandle(const TSdpServRecordHandle aHandle);
+	CSdpAttr* FindAttributeByID(CSdpServRecord& aRecord, const TSdpAttributeID aAttrId);
+
+	void UpdateOrCreateAtributeL(CSdpServRecord& aRecord, TSdpAttributeID aAttrId, const TDesC8& aPtr);
+	void DatabaseStateChange();
+
+private:
+	TInt iMaxSessionCount;
+	TInt iSessionCount;
+
+	CSdpServerShutdown		iShutdown;
+	
+	RSocketServ				iSocketServ;
+	CSdpListener*			iSdpListener;
+	CSdpDatabase*			iSdpDatabase;
+
+	CSdpServRecord*			iRecZero;
+	CSdpAttrValueUint*		iDbState;			// This value is used to update a state attribute whenever a record is 
+												// added or removed to facilitate caching by remotes
+	CAttrEncoderVisitor*	iEncoderVisitor;	// We maintain a pre-alloced encoder visitor so we can update 
+												// attributes without having to allocate memory.
+	RBuf8					iEncodeBuf;			// Used by the encoder to encode into
+	CSdpUuidManager*		iUuidManager;
+	};
+
+
+/**
+   SDP Server Session.
+   General purpose session used to create functionally specific subsessions.
+**/
+NONSHARABLE_CLASS(CSdpServSession) : public CSession2
+	{
+private:
+	enum TSubSessionType{ESdpAgent, ESdpDatabase}; /*however sdpagent is still 
+												     part of esock and may never
+													 be moved here*/
+
+public:
+	CSdpServSession(const RMessage2& aMessage);
+	~CSdpServSession();
+
+	void ServiceL(const RMessage2 &aMessage);
+
+	//Create/delete subsession
+	void NewSubSessionL(TSubSessionType aType, const RMessage2& aMessage);
+	void CloseSubSession(const RMessage2& aMessage); //can't fail - can panic client
+
+	//resource counting
+	void NumResourcesL(const RMessage2& aMessage);
+	TInt CountResources();
+
+	CSdpServer& Server();
+	void CreateL(const CServer2& aServer);
+
+private:
+	void ConstructL();
+	void CreateL();
+
+	void DeleteSubsession(TUint aHandle, const RMessage2& aMessage);
+	void RemoveSessionRecords();
+	
+private:
+	TUint iSubSessionCount;
+	RPointerArray<CSdpServRecord> iSessionRecords;
+	};
+
+
+//**********************************
+// CEirPublisherSdpUuidBase
+//**********************************
+/**
+CEirPublisherSdpUuidBase provides base class for Sdp Uuid Eir Publisher.
+**/
+NONSHARABLE_CLASS(CEirPublisherSdpUuidBase) : public CBase, public MEirPublisherNotifier
+	{
+public:
+	static CEirPublisherSdpUuidBase* NewL(CSdpUuidManager& aSdpUuidManager, TEirTag aTag);
+
+	~CEirPublisherSdpUuidBase();
+	void UpdateUuids(TInt aLength);
+
+protected:
+	CEirPublisherSdpUuidBase(CSdpUuidManager& aSdpUuidManager, TEirTag aTag);
+	void ConstructL();
+
+protected:
+	CSdpUuidManager& iParent;
+	CEirPublisher* iPublisher; 
+	TEirTag iTag;
+	};
+
+//**********************************
+// CEirPublisherSdpUuid16
+//**********************************
+/**
+Provides functionality to publish 16 bit UUIDs to EIR.
+**/
+NONSHARABLE_CLASS(CEirPublisherSdpUuid16) : public CEirPublisherSdpUuidBase
+	{
+public:
+	static CEirPublisherSdpUuid16* NewL(CSdpUuidManager& aSdpDatabase);
+	~CEirPublisherSdpUuid16();
+
+private:
+	CEirPublisherSdpUuid16(CSdpUuidManager& aSdpDatabase);
+
+	// From MEirPublisherNotifier
+	void MepnSpaceAvailable(TUint aBytesAvailable);
+	void MepnSetDataError(TInt aResult);
+
+private:
+	HBufC8* iExtracted;
+	};
+
+//**********************************
+// CEirPublisherSdpUuid128
+//**********************************
+/**
+Provides functionality to publish 128 bit UUIDs to EIR.
+**/
+NONSHARABLE_CLASS(CEirPublisherSdpUuid128) : public CEirPublisherSdpUuidBase
+	{
+public:
+	static CEirPublisherSdpUuid128* NewL(CSdpUuidManager& aSdpDatabase);
+	~CEirPublisherSdpUuid128();
+
+private:
+	CEirPublisherSdpUuid128(CSdpUuidManager& aSdpDatabase);
+
+	// From MEirPublisherNotifier
+	void MepnSpaceAvailable(TUint aBytesAvailable);
+	void MepnSetDataError(TInt aResult);
+
+private:
+	HBufC8* iExtracted;
+	};
+
+
+//**********************************
+// CSdpUuidManager
+//**********************************
+/**
+Retrieve UUIDs from CSdpDatabase and then store them in 16 or 128 bit Eir Uuid PublishersUUIDs
+**/
+NONSHARABLE_CLASS(CSdpUuidManager) : public CBase
+	{
+public:
+	static CSdpUuidManager* NewL(CSdpDatabase& aSdpDatabase);
+	~CSdpUuidManager();
+	
+	void NotifySdpRecordChange();
+	void AddUuid(TUUID aUuid);
+	void ResetUuids();
+	HBufC8* GetAll16BitUUIDs(TInt aBytesAvailable, TBool& aPartial);
+	HBufC8* GetAll128BitUUIDs(TInt aBytesAvailable, TBool& aPartial);
+
+private:
+	CSdpUuidManager(CSdpDatabase& aSdpDatabase);
+	void ConstructL();
+
+private:
+	CSdpDatabase& 				iSdpDatabase;
+	CAttrUuidVisitor*			iUuidVisitor;
+	CEirPublisherSdpUuid16* 	iEirPublisherSdpUuid16;
+	CEirPublisherSdpUuid128*	iEirPublisherSdpUuid128;
+	RUUIDContainer				i16BitUUIDs;
+	RUUIDContainer				i128BitUUIDs;
+	};
+
+enum TSdpServerPanics
+	{
+	ESdpServerUuidFlattenBroken = 0,
+	ESdpServerDeleteServiceRecordHandleZero = 1,
+	ESdpServerUpdateAttributeRecordHandleZero = 2,
+	ESdpServerDeleteAttributeRecordHandleZero = 3
+	};
+_LIT(KSdpServerPanicName, "SdpServer");
+
+#endif