windowing/windowserver/nga/CLIENT/CLIENT.H
changeset 0 5d03bc08d59c
child 26 15986eb6c500
child 36 01a6848ebfd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/CLIENT/CLIENT.H	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,189 @@
+// 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:
+// Window server client side local header file
+// 
+//
+
+#ifndef __CLIENT_H__
+#define __CLIENT_H__
+
+#include <e32hashtab.h>
+
+#if defined(_DEBUG) && defined(__WINS__)
+//#define __AUTO_FLUSH		//Define this for test purposes only, it hard codes auto flushing
+#endif
+
+/** Panics the client. This will result in the client thread being destroyed. */ 
+GLREF_C void Panic(TW32Panic aPanic); 
+GLREF_C void Assert(TW32Assert aPanic); 
+
+class TReadDescriptorType;
+class TWriteDescriptorType;
+
+class RWsBuffer
+	{
+	friend class RWsSession;
+public:
+	enum bufferSizes
+		{
+		EDefBufferSize=EClientBufferSize,
+		EMinBufferSize=EClientBufferSize,
+		EMaxBufferSize=EClientBufferMaxSize
+		};
+public:
+	RWsBuffer(RWsSession *aSession);
+	void Close();
+	void Destroy();
+	TInt Open();
+	TInt Connect(TUint32 handle);
+	TInt WriteReplyWs(TUint opcode);
+	TInt WriteReplyWs(const TAny *pData, TInt length,TUint opcode);
+	TInt WriteReplyWs(const TAny *pData, TInt length, const TAny *pData2, TInt length2, TUint opcode);
+	void SetBufferSizeL(TInt aBufSize);
+	void SetMaxBufferSizeL(TInt aMaxBufSize);
+	TInt Flush(const TIpcArgs* aIpcArgs=NULL,TBool aRequestFinish=EFalse);
+	TBool SetAutoFlush(TBool aState);
+	void Write(TInt handle,TUint opcode,const TAny *pData, TInt length,const TAny *pData2, TInt length2);
+	void Write(TInt handle,TUint opcode,const TAny *buf, TInt bufLen);
+	void Write(TInt handle,TUint opcode);
+	TInt WriteReply(TInt handle,TUint opcode, const TIpcArgs* aIpcArgs=NULL);
+	TInt WriteReply(TInt handle,TUint opcode,const TAny *buf, TInt bufLen, const TIpcArgs* aIpcArgs=NULL);
+	TInt WriteReply(TInt handle,TUint opcode,const TAny *buf, TInt bufLen,const TAny *buf2, TInt buflen2, const TIpcArgs* aIpcArgs=NULL);
+	TInt WriteReplyP(TInt aHandle,TUint aOpcode,const TWriteDescriptorType& aReplyBuffer);
+	TInt WriteReplyP(TInt aHandle,TUint aOpcode,const TAny *aData,TInt aLength,const TWriteDescriptorType& aReplyBuffer);
+	TInt WriteReplyP(TInt aHandle,TUint aOpcode,const TAny *aData1,TInt aLengthData1,const TAny *aData2,TInt aLengthData2,const TWriteDescriptorType& aReplyBuffer);
+	TInt WriteReplyByProvidingRemoteReadAccess(TInt aHandle,TUint aOpcode,const TAny *aData, TInt aLength,const TReadDescriptorType& aRemoteReadBuffer);
+
+	inline TInt BufferSize() const;
+	inline TBool IsEmpty() const;
+	inline RWsSession* Session() {return iSession;}
+	static void FlushAllBuffers(TInt aBitmapHandle);
+	void SetCallBack();
+	void CancelCallBack();
+	void AddToBitmapArray(TInt aBitmapHandle);
+	
+	void SetWsGraphicManager(CWsGraphic::CManager* aManager);
+	static CWsGraphic::CManager* WsGraphicManager();
+
+	void AsyncRequest(TInt aHandle, TUint aOpcode, TRequestStatus& aStatus);
+
+	void EnableWindowSizeCacheL();
+	inline TBool WindowSizeCacheEnabled() const;
+	inline void MarkWindowSizeCacheDirty(TInt aHandle);
+	inline void RefreshWindowSizeCache(TInt aHandle, const TSize& aNewSize);
+	inline TInt CachedWindowSize(TInt aHandle, TSize& aSize);
+	inline void DestroyWindowSizeCacheEntry(TInt aHandle);	
+    
+private:
+	TInt DoWrite(TInt aHandle, TUint aOpcode, TBool aFlush, const TIpcArgs* aIpcArgs, const TAny* aData1=NULL, TInt aLength1=0, const TAny* aData2=NULL, TInt aLength2=0);
+	inline void SetAndLimitMaxBufSize(TInt aMaxBufSize);
+	void ReAllocBufferL(TInt aNewSize);
+	TBool ReAllocBuffer(TInt aNewSize);
+	void GrowBuffer(TInt aRequiredSpace, TInt aMsgSize);
+
+private:
+	RWsSession *iSession;
+	CWsGraphic::CManager* iManager;
+	TBool iAutoFlush;
+	TPtr8 iBuf;
+	RWsBuffer *iNext;
+	TInt iPreviousHandle;
+	TInt iBufSize;				// current buffer size, DoWrite can expand this up to iMaxBufize
+	TInt iMaxBufSize;			// maximum buffer size, set by SetBufferSizeL or SetMaxBufferSizeL
+private:		//Added here as adding it to RWsSession breaks BC.
+	TInt iDirectAcessCount;
+	RArray<TInt> iBitmapArray;
+	TBool iInvalidBitmapArray;
+
+	class TWindowSizeCacheEntry
+	    {
+	public:
+	    inline TWindowSizeCacheEntry(const TSize& aSize);
+	public:
+	    TSize iSize;
+	    TBool iDirty;
+	    };
+	
+	RHashMap<TInt, TWindowSizeCacheEntry>* iWindowSizeCache;
+	};
+
+
+inline TInt RWsBuffer::BufferSize() const
+	{return(iBuf.MaxLength());}
+
+inline TBool RWsBuffer::IsEmpty() const
+	{return iBuf.Length()==0;}
+
+inline RWsBuffer::TWindowSizeCacheEntry::TWindowSizeCacheEntry(const TSize& aSize)
+    : iSize(aSize), iDirty(EFalse)
+    {
+    }
+
+inline TBool RWsBuffer::WindowSizeCacheEnabled() const
+    {
+    return iWindowSizeCache ? ETrue : EFalse;
+    }
+
+inline void RWsBuffer::MarkWindowSizeCacheDirty(TInt aHandle)
+    {
+    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
+    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowSizeCache->Find(aHandle);
+    if (entry != NULL)
+        {
+        entry->iDirty = ETrue;
+        }
+    }
+
+inline void RWsBuffer::RefreshWindowSizeCache(TInt aHandle, const TSize& aNewSize)
+    {
+    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
+    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowSizeCache->Find(aHandle);
+    if (entry == NULL)
+        {
+        iWindowSizeCache->Insert(aHandle, RWsBuffer::TWindowSizeCacheEntry(aNewSize));
+        }
+    else
+        {
+        entry->iSize = aNewSize;
+        entry->iDirty = EFalse;
+        }
+    }
+
+inline TInt RWsBuffer::CachedWindowSize(TInt aHandle, TSize& aSize)
+    {
+    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
+    RWsBuffer::TWindowSizeCacheEntry* entry = iWindowSizeCache->Find(aHandle);
+    if ( entry && !(entry->iDirty) )
+        {
+        aSize = entry->iSize;
+        return KErrNone;
+        }
+    else
+        {
+        // return KErrNotFound when either entry not found for aHandle, or entry is dirty
+        return KErrNotFound;
+        }
+    }
+
+inline void RWsBuffer::DestroyWindowSizeCacheEntry(TInt aHandle)
+    {
+    __ASSERT_ALWAYS(iWindowSizeCache != NULL, Assert(EW32AssertWindowSizeCacheFailure));
+    TInt err = iWindowSizeCache->Remove(aHandle);
+    // If there is a window size cache entry, then err == KErrNone.
+    // Otherwise, there isn't a size cache entry, and err == KErrNotFound.
+    __ASSERT_DEBUG(err == KErrNone || err == KErrNotFound, Assert(EW32AssertWindowSizeCacheFailure));
+    }
+
+
+#endif