--- /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