persistentstorage/dbms/sdbms/SD_STD.H
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/sdbms/SD_STD.H	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,860 @@
+// Copyright (c) 1998-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:
+// DBMS Client/Server architecture
+// 
+//
+
+
+#include "U32STD.H"
+#include "D32SRV.H"
+#include "D32DRVR.H"
+#include <f32file.h>
+#include <s32mem.h>
+#include "D32VER.H"
+#include "D32Map.h"
+#include "Sd_DbProps.h"
+#include "Sd_PolicyProxy.h"
+#include "Sd_DriveSpace.h"
+
+// other classes referenced
+class HDbsColumns;
+struct TDbProps;
+
+// classes defined
+class TDbsParam;
+class RDbsObject;
+class CDbsDatabase;
+class CDbsIncremental;
+class CDbsCursor;
+class CDbsConstraint;
+class CDbsNotifier;
+class CDbsSource;
+class RDbsSources;
+class CDbsServer;
+class CDbsSession;
+class HDbsStream;
+
+#if defined(_DEBUG)
+/**
+@internalComponent
+*/
+#define _SMALL_BUFFER
+#endif
+
+using namespace DBSC;
+
+/**
+@internalComponent
+*/
+enum TDbsPanic
+	{
+	EDbsUnimplemented,              //0
+	EDbsInvalidColumn,
+	EDbsWrongType,
+	EDbsNoRowData,
+	EDbsNotInUpdate,
+	EDbsBadDescriptor,
+	EDbsBadHandle,
+	EDbsStreamMarkInvalid,
+	EDbsStreamLocationInvalid,
+	EDbsObserverRequestPending,
+    EDbsInvalidDrive                //10
+	};
+
+/**
+used by proxy classes
+@internalComponent
+*/
+GLREF_C void Panic(TDbsPanic aPanic);	
+
+/**
+@internalComponent
+*/
+GLREF_C void ExternalizeL(const TDbCol& aCol,RWriteStream& aStream);
+GLREF_C void ExternalizeL(const CDbColSet& aColSet,RWriteStream& aStream);
+GLREF_C void InternalizeL(CDbColSet& aColSet,RReadStream& aStream);
+GLREF_C void ExternalizeL(const CDbKey& aKey,RWriteStream& aStream);
+GLREF_C void InternalizeL(CDbKey& aKey,RReadStream& aStream);
+GLREF_C void ExternalizeL(const CDbNames& aNames,RWriteStream& aStream);
+GLREF_C void InternalizeL(CDbNames& aNames,RReadStream& aStream);
+GLREF_C void ExternalizeL(const CDbStrings& aNames,RWriteStream& aStream);
+GLREF_C void InternalizeL(CDbStrings& aNames,RReadStream& aStream);
+
+/**
+@internalComponent
+*/
+_LIT(KDbsServerName,"!DBMS server");
+_LIT(KDbsServerImg,"EDBSRV");		// DLL/EXE name
+const TUid KDbsServerUid3={0x100012a5};
+
+
+/**
+@internalComponent
+*/
+const TInt KDbsExitDelay=4*0x100000;	// ~4 seconds
+const TInt KDbsLeavePanic=~(1<<20);
+const TInt KTablePolicyMaskBit = 1024;	//Used in RDbs::Get<Obj>Policy() methods
+
+/**
+shared classes
+@internalComponent
+*/
+enum TDbsType {EDbsFree,EDbsDatabase,EDbsIncremental,EDbsCursor,EDbsConstraint,EDbsStream,EDbsObserver,EDbsMaxType=EDbsObserver,EDbsSession=EDbsFree};
+
+/**
+Make sure that KDbsFunc2SecurityPolicyMask array in SD_PolicyProxy.cpp gets updated if 
+new enum items are going to be added to TDbsFunction.
+@internalComponent
+*/
+enum TDbsFunction
+	{
+// Session functions
+	EDbsResourceMark,					//0
+	EDbsResourceCheck,
+	EDbsResourceCount,
+	EDbsSetHeapFailure,
+	EDbsOpenDatabase,
+// common functions
+	EDbsClose,
+// Database functions
+	EDbsDatabaseAuthenticate,           //Not used in SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
+	EDbsDatabaseDestroy,
+	EDbsDatabaseBegin,
+	EDbsDatabaseCommit,
+	EDbsDatabaseRollback,				//10
+	EDbsDatabaseProperty,
+	EDbsDatabaseCreateTable,
+	EDbsDatabaseTables,
+	EDbsDatabaseColumns,
+	EDbsDatabaseIndexes,
+	EDbsDatabaseKeys,
+	EDbsDatabaseOpenObserver,
+	EDbsDatabaseOpenUtility,
+	EDbsDatabaseOpenDropTable,
+	EDbsDatabaseOpenAlterTable,			//20
+	EDbsDatabaseOpenCreateIndex,
+	EDbsDatabaseOpenDropIndex,
+	EDbsDatabaseExecute,
+	EDbsDatabasePrepareView,
+	EDbsDatabaseOpenTable,
+// Observer functions
+	EDbsObserverNotify,
+	EDbsObserverCancel,
+// Incremental functions
+	EDbsIncrementalNext,
+// Cursor functions
+	EDbsCursorColumnTypes,
+	EDbsCursorReset,					//30
+	EDbsCursorEvaluate,
+	EDbsCursorUnevaluated,
+	EDbsCursorSetIndex,
+	EDbsCursorSeek,
+	EDbsCursorAtBeginning,
+	EDbsCursorAtEnd,
+	EDbsCursorAtRow,
+	EDbsCursorCount,
+	EDbsCursorGotoPos,
+	EDbsCursorBookmark,					//40
+	EDbsCursorGotoBookmark,
+	EDbsCursorGet,
+	EDbsCursorInsert,
+	EDbsCursorUpdate,
+	EDbsCursorRetrieveRow,
+	EDbsCursorCancel,
+	EDbsCursorPut,
+	EDbsCursorDelete,
+	EDbsCursorColumns,
+	EDbsCursorColumnDef,				//50
+	EDbsCursorSetNull,
+	EDbsCursorColumnSize,
+	EDbsCursorColumnSource,
+	EDbsCursorColumnSink,
+	EDbsCursorOpenConstraint,
+	EDbsCursorMatch,
+	EDbsCursorFind,
+// stream functions
+	EDbsStreamRead,
+	EDbsStreamWrite,
+	EDbsStreamSize,						//60
+	EDbsStreamSynch,
+// Session functions
+	EDbsCreateDatabase,
+	EDbsDatabaseList,
+	EDbsCopyDatabase,
+	EDbsDeleteDatabase,
+	EDbsGetSecurityPolicy,
+// reserved disk space handling functions
+	EDbsReserveDriveSpace,
+	EDbsFreeReservedSpace,
+	EDbsReserveGetAccess,
+	EDbsReserveReleaseAccess,			//70
+//
+	EDbsGetBackupPath,	
+	EDbsGetBackupPaths,	
+	//Insert new functuions here
+	EDbsLast
+	};
+
+/**
+@internalComponent
+*/
+const TInt KDbsTypeBits=4;
+const TInt KDbsMagicBits=4;
+const TInt KDbsIndexBits=14;
+const TInt KDbsFunctionBits=9;
+const TInt KDbsHandleBits=KDbsTypeBits+KDbsMagicBits+KDbsIndexBits;
+const TInt KDbsTypeMask=(1<<KDbsTypeBits)-1;
+const TInt KDbsMagicMask=(1<<KDbsMagicBits)-1;
+const TInt KDbsHandleMask=(1<<KDbsHandleBits)-1;
+const TInt KDbsObjectReturn=1<<(KDbsFunctionBits-1);
+const TInt KDbsIndexLimit=1<<KDbsIndexBits;
+
+/**
+@internalComponent
+*/
+#define KDbsSessionHandle DbsSessionHandle()
+
+/**
+@internalComponent
+*/
+inline TInt DbsMessage(TInt aFunction,TInt aHandle);
+inline TDbsFunction DbsFunction(TInt aMessage);
+inline TInt DbsHandle(TInt aMessage);
+inline TDbsType DbsType(TInt aHandle);
+inline TInt DbsMagic(TInt aHandle);
+inline TInt DbsObjectIndex(TInt aHandle);
+inline TInt DbsMakeHandle(TInt aIndex,TInt aMagic,TDbsType aType);
+inline TInt DbsSessionHandle();
+
+#if !defined(_SMALL_BUFFER)
+/**
+@internalComponent
+*/
+const TInt KDbsStreamBufSize=0x600;		// 1.5K
+const TInt KDbsStreamIoSize=0xc00;		// 3K
+const TInt KDbsColumnTypesSize=0x200;	// .5K
+#else
+const TInt KDbsStreamBufSize=2;
+const TInt KDbsStreamIoSize=32;
+const TInt KDbsColumnTypesSize=2;
+#endif
+
+/**
+@internalComponent
+*/
+class TDbsStreamBuf
+	{
+public:
+	enum {ESize=KDbsStreamBufSize};
+public:
+	TInt iExt;
+	TUint8 iData[ESize];
+	};
+
+/**
+@internalComponent
+*/
+class TDbsColumns
+	{
+public:
+	enum {EMax=KDbsColumnTypesSize};
+public:
+	TInt iCount;
+	TUint8 iData[EMax];
+	};
+
+/**
+client side classes
+@internalComponent
+*/
+class TDbsParam
+	{
+public:
+	inline void operator=(const TDesC8& aDes);
+	inline void operator=(const TDesC16& aDes);
+	inline void operator=(TInt aVal);
+//
+	static TPtrC8 PrepareLC(const CDbColSet& aColSet);
+	static TPtrC8 PrepareLC(const CDbKey& aKey);
+	static TPtrC8 PrepareLC(const TDbLookupKey& aKey);
+	
+private:
+	union
+		{
+		const TAny* iPtr;
+		TInt iInt;
+		};
+	};
+
+/**
+@internalComponent
+*/
+typedef TDbsParam TDbsMessage[4];
+
+/**
+@internalComponent
+*/
+class RDbsObject : private RDbs
+	{
+public:
+	inline RDbsObject();
+	inline void OpenL(const RDbsObject& aDbs,TDbsFunction aFunction);
+	inline void OpenL(const RDbsObject& aDbs,TDbsFunction aFunction,const TIpcArgs& aArgs);
+	inline void OpenL(const RDbs& aDbs,TDbsFunction aFunction,const TIpcArgs& aArgs);
+	void Close();
+//
+	inline TInt Handle() const;
+//
+	TInt SendReceive(TDbsFunction aFunction) const;
+	inline TInt SendReceive(TDbsFunction aFunction,const TIpcArgs& aArgs) const;
+	TInt SendReceiveL(TDbsFunction aFunction) const;
+	inline TInt SendReceiveL(TDbsFunction aFunction,const TIpcArgs& aArgs) const;
+	inline void SendReceive(TDbsFunction aFunction,TRequestStatus& aStatus) const;
+	inline void SendReceive(TDbsFunction aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
+private:
+	inline RDbsObject(const RDbs& aDbs);
+	void SendReceive(TDbsFunction aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
+	TInt SendReceive(TDbsFunction aFunction,const TIpcArgs* aArgs) const;
+	TInt SendReceiveL(TDbsFunction aFunction,const TIpcArgs* aArgs) const;
+	void OpenL(const RDbsObject& aDbs,TDbsFunction aFunction,const TIpcArgs* aArgs);
+private:
+	TInt iHandle;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsDatabase) : public CDbDatabase
+	{
+	friend class CDbsSecureDatabase;
+public:
+	static CDbsDatabase* NewL(const RDbs& aDbs,const TDesC& aDatabase,const TDesC& aFormat);
+	~CDbsDatabase();
+//
+private:
+	inline CDbsDatabase();
+	void ConstructL(const RDbs& aDbs,TIpcArgs& aArgs);
+// from CDbDatabase
+	TInt Destroy();
+	TInt Begin();
+	TInt Commit();
+	void Rollback();
+	TInt Property(TProperty aProperty);
+	void CreateTableL(const TDesC& aName,const CDbColSet& aColSet,const CDbKey* aPrimaryKey);
+	void TablesL(CDbTableNames& aNames);
+	void ColumnsL(CDbColSet& aColSet,const TDesC& aName);
+	void IndexesL(CDbIndexNames& aNames,const TDesC& aTable);
+	void KeysL(CDbKey& aKey,const TDesC& aName,const TDesC& aTable);
+	CDbNotifier* OpenNotifierL();
+	CDbIncremental* OpenUtilityL(TUtility aType,TInt& aStep);
+	CDbIncremental* OpenCompactL(TInt& aStep);
+	CDbIncremental* OpenRecoverL(TInt& aStep);
+	CDbIncremental* OpenDropTableL(const TDesC& aTable,TInt& aStep);
+	CDbIncremental* OpenAlterTableL(const TDesC& aTable,const CDbColSet& aNewDef,TInt& aStep);
+	CDbIncremental* OpenCreateIndexL(const TDesC& aName,const TDesC& aTable,const CDbKey& aKey,TInt& aStep);
+	CDbIncremental* OpenDropIndexL(const TDesC& aName,const TDesC& aTable,TInt& aStep);
+	CDbIncremental* OpenExecuteL(const TDesC& aSql,TDbTextComparison aComparison,TInt& aInit);
+	CDbCursor* PrepareViewL(const TDbQuery& aQuery,const TDbWindow& aWindow,RDbRowSet::TAccess anAccess);
+	CDbCursor* OpenTableL(const TDesC& aName,RDbRowSet::TAccess anAccess);
+private:
+	RDbsObject iObject;
+	};
+
+//Secure shared database
+NONSHARABLE_CLASS(CDbsSecureDatabase) : public CDbsDatabase
+	{
+public:
+	static CDbsSecureDatabase* NewL(const RDbs& aDbs,const TDesC& aDatabase,const TDesC& aFormat);
+	virtual ~CDbsSecureDatabase();
+
+private:
+	inline CDbsSecureDatabase();
+	void ConstructL(const RDbs& aDbs,TIpcArgs& aArgs);
+
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsNotifier) : public CDbNotifier
+	{
+public:
+	static CDbsNotifier* NewL(const RDbsObject& aDatabase);
+private:
+	inline CDbsNotifier();
+	~CDbsNotifier();
+// from CDbObserver
+	void Notify(TType aEvent,TRequestStatus& aStatus);
+	void Cancel();
+private:
+	RDbsObject iObject;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsIncremental) : public CDbAsyncIncremental
+	{
+public:
+	static CDbsIncremental* NewL(const RDbsObject& aDbs,TDbsFunction aFunction,TIpcArgs& aArgs,TInt& aStep);
+	~CDbsIncremental();
+private:
+	inline CDbsIncremental();
+// from CDbAsyncIncremental
+	void Next(TPckgBuf<TInt>& aStep,TRequestStatus& aStatus);
+private:
+	RDbsObject iObject;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsCursor) : public CDbCursor
+	{
+public:
+	static CDbsCursor* NewL(const RDbsObject& aDbs,TDbsFunction aFunction,TIpcArgs& aArgs);
+	~CDbsCursor();
+private:
+	CDbsCursor();
+	void ConstructL(const RDbsObject& aDbs,TDbsFunction aFunction,TIpcArgs& aArgs);
+//
+	TDbColType Type(TDbColNo aCol) const;
+	void ReplaceBlobL(TDbColumn& aCol);
+	TBool RetrieveL(TDbsFunction aFunction,TInt aArg0=0);
+// from CDbCursor
+	void Reset();
+	TBool EvaluateL();
+	void Evaluate(TRequestStatus& aStatus);
+	TBool Unevaluated();
+	void SetIndexL(const TDesC* anIndex);
+	TBool SeekL(const TDbLookupKey& aKey,RDbTable::TComparison aComparison);
+	TBool AtBeginning();
+	TBool AtEnd();
+	TBool AtRow();
+	TInt CountL(RDbRowSet::TAccuracy aAccuracy);
+	TBool GotoL(RDbRowSet::TPosition aPosition);
+	void Bookmark(TDbBookmark::TMark& aMark);
+	void GotoL(const TDbBookmark::TMark& aMark);
+	void GetL();
+	void InsertL(TInsert aClearRow);
+	void UpdateL();
+	void Cancel();
+	void PutL();
+	void DeleteL();
+	TInt ColumnCount();
+	void ColumnsL(CDbColSet& aColSet);
+	void ColumnDef(TDbCol& aCol,TDbColNo aColNo);
+	TDbColType ColumnType(TDbColNo aCol);
+	RDbRow* RowBuffer();
+	TDbColumnC ColumnC(TDbColNo aCol);	// non-writeable column
+	TDbColumn Column(TDbColNo aCol);		// writeable column
+	void SetNullL(TDbColNo aCol);
+	TInt ColumnSize(TDbColNo aCol);
+	MStreamBuf* ColumnSourceL(TDbColNo aCol);
+	MStreamBuf* ColumnSinkL(TDbColNo aCol);
+	CDbRowConstraint* OpenConstraintL(const TDbQuery& aCriteria);
+	TBool MatchL(CDbRowConstraint& aCursor);
+	TInt FindL(RDbRowSet::TDirection aDirection,const TDbQuery& aCriteria);
+private:
+	enum TState {EUnknown,EAtBeginning,EAtEnd,EAtRow,ERetrieve,ERead,EWrite};
+private:
+	RDbsObject iObject;
+	TState iState;
+	TBool iChangedBlob;
+	HDbsColumns* iColumns;
+	RDbRow iRow;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsConstraint) : public CDbRowConstraint
+	{
+	friend class CDbsCursor;
+private:
+	inline CDbsConstraint();
+	~CDbsConstraint();
+private:
+	RDbsObject iObject;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(HDbsBuf) : public TStreamBuf
+	{
+public:
+	static HDbsBuf* NewL(const RDbsObject& aObject,TDbsFunction aFunction,TIpcArgs& aArgs);
+	static HDbsBuf* NewLC(const RDbsObject& aObject,TDbsFunction aFunction,TIpcArgs& aArgs);
+	static HDbsBuf* NewLC(const RDbs& aDbSession, TDbsFunction aFunction, TIpcArgs& aArgs);
+	virtual inline ~HDbsBuf();
+private:
+	inline HDbsBuf();
+	void ConstructL(const RDbsObject& aObject,TDbsFunction aFunction,TIpcArgs& aArgs);
+	void ConstructL(const RDbs& aDbSession, TDbsFunction aFunction, TIpcArgs& aArgs);
+// from TStreamBuf
+	TInt UnderflowL(TInt aMaxLength);
+	void OverflowL();
+	void DoRelease();
+	void DoSynchL();
+	TInt DoReadL(TAny* aPtr,TInt aMaxLength);
+	void DoWriteL(const TAny* aPtr,TInt aLength);
+	TStreamPos DoSeekL(TMark aMark,TStreamLocation aLocation,TInt anOffset);
+private:
+	inline void SetPos(TRead,TInt aPos);
+	inline void SetPos(TWrite,TInt aPos);
+	inline TInt Pos(TRead) const;
+	inline TInt Pos(TWrite) const;
+	inline TInt MovePos(TRead,TInt anOffset);
+	inline TInt MovePos(TWrite,TInt anOffset);
+	TInt IpcReadL(TAny* aPtr,TInt aMaxLength);
+	void IpcWriteL(const TAny* aPtr,TInt aLength);
+	TInt EndL();
+//
+	inline TInt Lag(TRead) const;
+	inline TInt Lag(TWrite) const;
+	inline TInt Mark(TRead) const;
+	inline TInt Mark(TWrite) const;
+private:
+	RDbsObject iIpc;
+	TInt iRPos;
+	TInt iWPos;
+	TDbsStreamBuf iBuf;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(HDbsReadBuf) : public TMemBuf
+	{
+public:
+	static HDbsReadBuf* NewL(const TDesC8& aDes);
+protected:
+	inline HDbsReadBuf(const TDesC8& aDes);
+	void DoRelease();
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsObserver) : public CActive
+	{
+public:
+	/**
+	@internalComponent
+	*/
+	class HObserver
+		{
+		friend class CDbsObserver;
+	public:
+		~HObserver();
+		void Notify(const RMessage2& aMessage);		
+		void Cancel();
+	private:
+		inline HObserver();
+		void Complete(TInt aStatus);
+		void Event(TInt aEvent);
+	private:
+		TDblQueLink iLink;
+		TInt iPending;
+		RMessagePtr2 iMessage;
+		};
+	friend class HObserver;
+public:
+	static CDbsObserver* NewL(CDbsSource& aSource);
+	static CDbsObserver* Collect(CDbsObserver* aNotifier);
+	HObserver* ObserverL();
+private:
+	inline CDbsObserver(CDbsSource& aSource);
+	~CDbsObserver();
+//
+	void Queue();
+// from CActive
+	void RunL();
+	void DoCancel();
+private:
+	CDbsSource& iSource;
+	CDbNotifier* iNotifier;
+	TDblQue<HObserver> iQueue;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsConnection) : public CDbContext
+	{
+	friend class RDbsSources;
+public:
+	inline CDbsSource& Source() const;
+	static inline const CDbsConnection& Connection(const CDbObject& aObject);
+	static inline CDbsSource& Source(const CDbObject& aObject);
+private:
+	inline CDbsConnection() {}
+	~CDbsConnection();
+	inline void Set(CDbsSource& aSource);
+private:
+	CDbsSource* iSource;
+	};
+
+/**
+@internalComponent
+*/
+class CDbsDatabaseStub : public CDbObject
+	{
+public:
+	static CDbsDatabaseStub* NewL();
+	CDbDatabase* AuthenticateL();
+private:
+	inline CDbsDatabaseStub();
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsSource) : public CBase
+	{
+	friend class CDbsConnection;
+	friend class CDbsObserver;
+public:
+	static CDbsSource* NewL(RFs& aFs,const TDesC& aSource);
+//
+	static inline TInt LinkOffset();
+	TBool Is(const TDesC& aSource) const;
+//
+	inline CDbSource& Source();
+	CDbsObserver::HObserver* ObserverL();
+private:
+	inline CDbsSource(const TDbFormat& aFormat);
+	~CDbsSource();
+	void Closed();
+//
+	inline void Open();
+	void Close();
+private:
+	TDblQueLink iLink;
+	HBufC* iName;
+	const TDbFormat& iFormat;
+	TInt iConnections;
+	CDbSource* iSource;
+	CDbsObserver* iObserver;
+	};
+
+/**
+@internalComponent
+*/
+class RDbsSources
+	{
+private:
+	typedef TDblQueIter<CDbsSource> TIter;
+public:
+	inline RDbsSources(RDbCache& aCache);
+	inline void Close();
+//
+	CDbsConnection* OpenLC(RFs& aFs,const TDesC& aSource,const TDesC& aFormat);
+private:
+	TDblQue<CDbsSource> iSources;
+	RDbCache iDrivers;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsServer) : public CServer2
+	{
+public:
+	static CDbsServer* NewL();
+//
+	inline TDes& Name0();
+	inline TDes& Name1();
+	inline TDes& FileName();
+	inline RDbsSources& Sources();
+	inline RFs& Fs();
+	inline RDriveSpaceCol& DriveSpaceCol();
+	void RemoveSession();
+//
+	static CDbsServer* Instance();
+	void Panic(const TDesC& aCategory,TInt aCode);	// .. panic client!
+
+	inline CPolicyProxy& PolicyProxy() const;
+	inline RDbPropsFactory& DbPropsFactory();
+
+private:
+	inline CDbsServer();
+	~CDbsServer();
+	void ConstructL();
+// from CServer
+	CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const;
+private:
+	enum {ECacheSize=8};
+	enum {EServerPriority=0};
+private:
+	RDbCache iCache;
+	RDbsSources iSources;
+	TDbName iName0;		// used for message servicing
+	TDbName iName1;
+	TFileName iFileName;
+	RFs iFs;
+	CPolicyProxy* iPolicyProxy;
+	RDbPropsFactory iDbPropsFactory;
+	RDriveSpaceCol iDriveSpaceCol;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbsSession) : public CSession2
+	{
+private:
+#if !defined(_SMALL_BUFFER)
+	enum {EIndexGranularity=8};
+#else
+	enum {EIndexGranularity=1};
+#endif
+	struct TEntry
+		{
+		union
+			{
+			TAny* iObject;
+			TInt iNext;
+			};
+		TUint8 iType;
+		const MPolicy* iPolicy;
+		TUint8 iMagic;
+	public:
+		void Release();
+		DECLARE_DB_DUMP3(aFile)
+	//
+		inline TDbsType Type() const;
+		inline CDbsDatabaseStub& DatabaseStub();
+		inline CDbDatabase& Database();
+		inline CDbIncremental& Incremental();
+		inline CDbCursor& Cursor();
+		inline CDbRowConstraint& Constraint();
+		inline HDbsStream& Stream();
+		inline CDbsObserver::HObserver& Observer();
+		};
+public:
+	CDbsSession();
+	virtual ~CDbsSession();
+private:
+//From CSession2
+	virtual void CreateL();
+// from CSession
+	void ServiceL(const RMessage2& aMessage);	
+	TInt ExtServiceL(const RMessage2& aMessage, TDbsFunction aDbsFunction);
+	void ServiceError(const RMessage2& aMessage,TInt aError);
+	TInt CountResources();
+//
+	inline CDbsServer& Server() const;
+	inline RDbsSources& Sources();
+//
+	const TDesC& ReadName0L(TInt aIndex,const RMessage2& aMessage);
+	const TDesC& ReadName1L(TInt aIndex,const RMessage2& aMessage);
+	const TDesC& ReadFileNameL(TInt aIndex, const RMessage2& aMessage);
+	HBufC* ReadHBufLC(TInt aIndex,const RMessage2& aMessage);
+	HBufC8* ReadHBuf8LC(TInt aIndex,const RMessage2& aMessage);
+	CDbColSet* ColSetLC(TInt aIndex,const RMessage2& aMessage);
+	CDbKey* KeyLC(TInt aIndex,const RMessage2& aMessage);
+	TDbLookupKey* LookupKeyLC(TInt aIndex,TInt aSize,const RMessage2& aMessage);
+	CDbObject* DoAuthenticateL(CDbsConnection* aDbsConnection, const RMessage2& aMessage);
+	TInt DoOpenDatabaseL(const RMessage2& aMessage, const TDbProps& aDbProps);
+
+	TDbProps* ExtractDbPropsLC(const RMessage2& aMessage);
+	TInt OpenDatabaseL(const RMessage2& aMessage);	
+	TInt CreateDatabaseL(const RMessage2& aMessage);
+	TInt DoCreateDatabaseL(const RMessage2& aMessage, const TDbProps& aDbProps);
+	void CopyDatabaseL(const RMessage2& aMessage);
+	void DeleteDatabaseL(const RMessage2& aMessage);
+	TInt GetDatabaseListL(const RMessage2& aMessage);	
+	void GetSecurityPolicyL(const RMessage2& aMessage);	
+	void ReadRowL(RDbRow& aRow,TInt aSize,const RMessage2& aMessage);
+	void PutRowL(CDbCursor& aCursor,const RMessage2& aMessage);
+	TInt WriteRowL(const RDbRow& aRow,const RMessage2& aMessage);
+	TInt RetrieveRowL(CDbCursor& aCursor,const RMessage2& aMessage);
+	TInt NewCursorL(CDbCursor* aCursor,const RMessage2& aMessage,const MPolicy* aTblSecurityPolicy);
+	TInt NewIncrementalL(CDbIncremental* aCursor,TInt& aInit,const RMessage2& aMessage,const MPolicy* aPolicy);
+	TInt NewStreamL(MStreamBuf* aHost,const RMessage2& aMessage,const MPolicy* aPolicy,TInt aExtent=-1);
+	TInt NewStreamL(TAny* aPtr,TExternalizeFunction aExter,const RMessage2& aMessage,const MPolicy* aPolicy);
+	void NewDbEntryL(CDbObject* aDbObject, const TDbPolicyRequest& aDbPolicyRequest, TInt& aDbHandle);
+	
+#ifdef __DBDUMP__
+	void Dump();
+#endif	
+
+	void ReserveDriveSpaceL(TDriveNumber aDrive);
+	void FreeReservedSpace(TDriveNumber aDrive);
+	void GetReserveAccessL(TDriveNumber aDrive);
+	void ReleaseReserveAccess(TDriveNumber aDrive);
+	
+	void GetBackupPathL(const RMessage2& aMessage);
+	TInt GetBackupPathsL(const RMessage2& aMessage);
+
+	inline TInt Add(CDbIncremental* aIncremental, const MPolicy* aPolicy);
+	inline TInt Add(CDbCursor* aCursor, const MPolicy* aPolicy);
+	inline TInt Add(CDbRowConstraint* aConstraint, const MPolicy* aPolicy);
+	inline TInt Add(HDbsStream* aStream, const MPolicy* aPolicy);
+	inline TInt Add(CDbsObserver::HObserver* aObserver, const MPolicy* aPolicy);
+
+	TEntry& Object(TInt aHandle);
+	void AllocL();
+	TInt DoAdd(TAny* aObject,TDbsType aType, const MPolicy* aPolicy);
+	void Free(TEntry& aEntry);
+
+private:
+	TEntry* iIx;
+	TInt iSize;
+	TInt iFree;
+	RMap<TInt, TDbPolicyRequest> iDbPolicyRqColl;
+    CDbsSessDriveSpace* iSessDriveSpace;
+	};
+
+/**
+@internalComponent
+*/
+class HDbsStream
+	{
+public:
+	inline HDbsStream(MStreamBuf* aHost,TInt aReadPos);
+	inline ~HDbsStream();
+//
+	TInt ReadL(const RMessage2& aMessage);	
+	void WriteL(const RMessage2& aMessage);	
+	inline TInt SizeL();
+	inline void SynchL();
+private:
+	MStreamBuf& iHost;
+	TInt iRPos;
+	TInt iWPos;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(HBufBuf) : public TBufBuf
+	{
+	enum {EGranularity=512};
+public:
+	static HBufBuf* NewLC();
+private:
+	inline HBufBuf();
+	virtual inline ~HBufBuf();
+	void DoRelease();
+private:
+	CBufBase* iBuf;
+	};
+
+#include "SD_STD.INL"
+
+
+