diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/nga/CLIENT/CLIENT.H --- /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 + +#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 iBitmapArray; + TBool iInvalidBitmapArray; + + class TWindowSizeCacheEntry + { + public: + inline TWindowSizeCacheEntry(const TSize& aSize); + public: + TSize iSize; + TBool iDirty; + }; + + RHashMap* 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